2017-03-02 39 views
0

有人能幫我重構下面的代碼,以便它編譯(使用pre-C++ 11編譯器)。具有頭文件和源文件的部分和完整模板專業化

MyClass.h:

namespace myns { 
enum LiteralTypes { 
    kINT_LITERAL = 0, 
    kSTRING_LITERAL 
}; 

class MyClass { 
    template <LiteralTypes literal_type, typename T> struct AddLiterals; 

    template <typename T> 
    struct AddLiterals<kINT_LITERAL, T> { 
    static void apply(const vector<T>& vals); 
    }; 

    template <> 
    struct AddLiterals<kSTRING_LITERAL, char*> { 
    static void apply(const vector<char*>& vals); 
    }; 


    template <> 
    struct AddLiterals<kSTRING_LITERAL, std::string> { 
    static void apply(const vector<std::string>& vals); 
    }; 
}; 
} 

MyClass.cpp

namespace myns { 
template <typename T> 
void MyClass::AddLiterals<kINT_LITERAL, T>::apply(const vector<T>& vals) { 
    BOOST_STATIC_ASSERT((boost::is_same<T, int16_t>::value || 
         boost::is_same<T, int32_t>::value || 
         boost::is_same<T, int64_t>::value)); 
    // Implementation 
} 

template <> 
void MyClass::AddLiterals<kINT_LITERAL, char*>::apply(const vector<char*>& vals) { 
    // Implementation 
} 

template <> 
void MyClass::AddLiterals<kINT_LITERAL, std::string>::apply(const vector<std::string>& vals) { 
    // Implementation 
} 
} 

我相信編譯錯誤是因爲全特具有在命名空間範圍進行界定,而不是類定義中。除此之外,我迷了路。

編輯: 錯誤消息(大致)如下:

MyClass.h: error: explicit specialization in non-namespace scope ‘class myns::MyClass’ 
MyClass.cpp: error: template-id ‘apply<>’ for ‘void myns::MyClass::AddLiterals<kSTRING_LITERAL, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::apply(const vector<std::string>& vals)’ does not match any template declaration 
MyClass.cpp: error: invalid function declaration 
+1

完成。對不起,沒有提供這首先。我手動將錯誤消息中的一些名稱替換爲上面示例中使用的名稱(並刪除了重複的錯誤消息)。 – user1622959

回答

0

以下爲我工作:

MyClass的.H:

namespace myns { 
enum LiteralTypes { 
    kINT_LITERAL = 0, 
    kSTRING_LITERAL 
}; 

class MyClass { 
    template <LiteralTypes literal_type, typename T> struct AddLiterals; 

    template <typename T> 
    struct AddLiterals<kINT_LITERAL, T> { 
    static void apply(const vector<T>& vals); 
    }; 

    template <typename T> 
    struct AddLiterals<kSTRING_LITERAL, T> { 
    static void apply(const vector<T>& vals); 
    }; 
}; 
} 

MyClass.cpp

namespace myns { 
template <typename T> 
void MyClass::AddLiterals<kINT_LITERAL, T>::apply(const vector<T>& vals) { 
    BOOST_STATIC_ASSERT((boost::is_same<T, int16_t>::value || 
         boost::is_same<T, int32_t>::value || 
         boost::is_same<T, int64_t>::value)); 
    // Implementation 
} 

template <> 
void MyClass::AddLiterals<kSTRING_LITERAL, char*>::apply(const vector<char*>& vals) { 
    // Implementation 
} 

template <> 
void MyClass::AddLiterals<kSTRING_LITERAL, std::string>::apply(const vector<std::string>& vals) { 
    // Implementation 
} 
} // namespace myns 
0

首先,你必須在你的錯誤消息的答案是:明確的專業化MUST在命名空間範圍:

打開你的標題變爲:

namespace myns { 
enum LiteralTypes { 
    kINT_LITERAL = 0, 
    kSTRING_LITERAL 
}; 

class MyClass { 
    template <LiteralTypes literal_type, typename T> struct AddLiterals; 
}; 

    template <typename T> 
    struct MyClass::AddLiterals<kINT_LITERAL, T> { 
    static void apply(const vector<T>& vals); 
    }; 

    template <> 
    struct MyClass::AddLiterals<kSTRING_LITERAL, char*> { 
    static void apply(const vector<char*>& vals); 
    }; 


    template <> 
    struct MyClass::AddLiterals<kSTRING_LITERAL, std::string> { 
    static void apply(const vector<std::string>& vals); 
    }; 
} 

其次,你有一個不匹配,注意你使用2與kSTRING_LITERAL d和3d專業化的聲明,但是與kINT_LITERAL在定義

第三,不用於specialization成員template<>,所以在CPP文件中省略它

+0

感謝您的幫助。我是否還需要重構.cpp文件中的任何內容?通過重構頭文件,我得到了以下錯誤:'MyClass.cpp:error:template-id'apply''for'void myns :: MyClass :: AddLiterals ,std :: allocator >> :: apply(const vector &vals)'不匹配任何模板聲明 MyClass.cpp:error:invalid function declaration' – user1622959