模板化类中单个方法的模板特化

Chu*_*uim 84 c++ templates specialization visual-studio-2008

始终考虑包含我的模板类的以下标头至少包含在两个.CPP文件中,此代码正确编译:

template <class T>
class TClass 
{
public:
  void doSomething(std::vector<T> * v);
};

template <class T>
void TClass<T>::doSomething(std::vector<T> * v) {
  // Do something with a vector of a generic T
}

template <>
inline void TClass<int>::doSomething(std::vector<int> * v) {
  // Do something with a vector of int's
}
Run Code Online (Sandbox Code Playgroud)

但请注意专业化方法中的内联.由于该方法被定义多次,因此需要避免链接器错误(在VS2008中为LNK2005).我理解这一点,因为AFAIK完整的模板专业化与简单的方法定义相同.

那么,我该如何删除inline?代码不应该在每次使用时都重复.我搜索了Google,在SO中阅读了一些问题并尝试了许多建议的解决方案但没有成功构建(至少在VS 2008中没有).

谢谢!

max*_*000 67

与简单函数一样,您可以使用声明和实现.放入标题声明:

template <>
void TClass<int>::doSomething(std::vector<int> * v);
Run Code Online (Sandbox Code Playgroud)

并将实现放入您的一个cpp文件中:

template <>
void TClass<int>::doSomething(std::vector<int> * v) {
 // Do somtehing with a vector of int's
}
Run Code Online (Sandbox Code Playgroud)

不要忘记删除内联(我忘了,并认为这个解决方案将无法工作:)).检查VC++ 2005


Bos*_*gan 5

您需要将专业化定义移至 CPP 文件。即使函数未声明为模板,也允许对模板类的成员函数进行特化。