3

以下代码(这是我需要的简化版本)没有链接

在 *.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 文件....

我在互联网上查找过(例如这里),这种类型的代码似乎没问题,但链接器不同意。你能帮忙吗?谢谢。

4

1 回答 1

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.;  }

您链接中的代码有效,因为该翻译单元可以看到专业化。

于 2012-05-29T14:03:10.033 回答