有人可以帮我重构以下代码,使其进行编译(使用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
}
}
我认为编译错误是因为必须在 namespace 范围而不是在类定义内部定义完全特化。除此之外,我迷路了。
编辑:
错误消息大致如下:
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
最佳答案
首先,您会在错误消息中找到答案:显式特化必须在命名空间范围内:
把你的头变成这样:
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);
};
}
其次,您在那里有一个不匹配项,请注意,您在声明中使用2d和3d特化和kSTRING_LITERAL,但在定义中使用kINT_LITERAL
第三,
template<>
不用于specialization的成员,因此在cpp文件中将其省略关于c++ - 带有头文件和源文件的部分和完整模板特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42565672/