23
##A.hh

template<class T> void func(T t) {}
template<> void func<int>(int t) {}

void func2();

##A.cpp

void func2() {}

##main.cpp

func("hello");
func(int());

私が得るエラーは次のとおりです: error LNK2005: "void __cdecl func(int)" (??$func@H@@YAXH@Z) already defined in A.obj, one or more complex defined symbols found

関数テンプレートの特殊化は、通常の関数テンプレートとして扱われませんか? A の目的のファイルにあるようです。

4

2 に答える 2

39

template<> void func<int>(int t) {}関数テンプレートではなく関数のオーバーロード (つまり、すべての型が定義の時点でわかっているため、テンプレートではなくなります) と同様に、複数の定義エラーを回避するために、.cpp ファイルとしてマークするか、.cpp ファイルで定義する必要がありますinline。他の関数定義と同様。

于 2011-03-24T09:50:25.827 に答える
15

問題は次のとおりです: テンプレートの完全な特殊化はもはやtemplateではなく、通常の functionに似ています。したがって、それに応じて行動する必要があります。

  • func<int>()の定義をcpp ファイルに入れる

  • またはインラインにする

于 2011-03-24T09:50:54.750 に答える