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) already defined in ..." および "2 番目の定義は無視されました" という警告 LNK4006 が表示されます。

私は InterfaceFunctionField2::to() 特殊化を 1 回だけ定義し、#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 に答える