来自模板类的单个方法的模板特化

始终考虑包含我的模板化类的以下标题包含在至less两个.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 somtehing with a vector of a generic T } template <> inline void TClass<int>::doSomething(std::vector<int> * v) { // Do somtehing with a vector of int's } 

但是注意专业化方法中的内联。 代码不要有链接器错误(在VS2008中是LNK2005),因为方法被定义了多次。 我明白这一点,因为AFAIK一个完整的模板专门化就像一个简单的方法定义一样。

那么,如何删除inline ? 代码不应该在每次使用时重复。 我search了谷歌,在这里阅读了一些问题,并尝试了许多build议的解决scheme,但没有成功构build(至less在VS 2008中没有)。

谢谢!

与简单的function一样,您可以使用声明和实现。 放入你的头文件声明:

 template <> void TClass<int>::doSomething(std::vector<int> * v); 

并把实现放到你的一个cpp文件中:

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

不要忘记删除内联(我忘了,认为这个解决scheme将无法正常工作:))。 检查了VC ++ 2005

您需要将专业化定义移动到CPP文件。 即使函数没有声明为模板,也允许模板类的成员函数的专业化。

没有理由删除关键字内联。
它不会改变代码的含义。

如果您想删除内联,无论出于何种原因,maxim1000的解决scheme是完全有效的。

不过,在你的评论中,似乎你认为inline关键字意味着带有所有内容的函数总是被内联,但是AFAIK实际上非常依赖于你的编译器优化。

从C ++ FAQ引用

有几种方法可以指定函数是内联的,其中一些涉及inline关键字,而另一些则不涉及。 无论您如何将函数指定为内联,它都是编译器允许忽略的一个请求:编译器可能会内联展开一些或全部或者没有调用指定为内联的函数的地方。 (不要灰心,如果这看起来毫无希望地模糊的话,上面的灵活性实际上是一个巨大的优势:它允许编译器将大的函数与小函数区别开来,再加上它让编译器生成易于debugging的代码正确的编译选项。)

所以,除非你知道这个函数实际上会膨胀你的可执行文件,或者除非你想从模板定义头文件中移除它,否则你可以把它放在没有任何伤害的地方