以下代码(这是我需要的简化版本)没有链接
在* .h文件中:
class InterfaceFunctionField2 {
public:
template<class outputType> outputType to() { return outputType(); }
};
在* .cpp文件中
template<> double InterfaceFunctionField2::to<double>()
{ return 3.; }
这个类位于静态库中。
我收到“错误LNK2005:”public:double __thiscall InterfaceFunctionField2 :: to(void)const“(?? $ to @ N @ InterfaceFunctionField2 @@ QBENXZ)已在...中定义”和“第二个定义被忽略“警告LNK4006
我只定义了InterfaceFunctionField2 :: to()专门化一次,而且我没有#include * .cpp文件....
我查了一下互联网(e.g. here),这种类型的代码似乎还可以,但链接器不同意。你能帮忙吗?感谢。
答案 0 :(得分:5)
您还需要在标题中声明特化。
//header.h
class InterfaceFunctionField2 {
public:
template<class outputType> outputType to() { return outputType(); }
};
template<> double InterfaceFunctionField2::to<double>();
//implementation.cc
template<> double InterfaceFunctionField2::to<double>()
{ return 3.; }
链接中的代码有效,因为该翻译单元可以看到专业化。