有人可以帮我重构以下代码,使其进行编译(使用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/

10-14 06:36