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) 已经在 A.obj 中定义,找到一个或多个多重定义的符号

函数模板特化不被视为普通函数模板吗?看起来它将在 A 的目标文件中。

4

2 回答 2

39

由于template<> void func<int>(int t) {}是函数重载而不是函数模板(即,所有类型在定义时都是已知的,因此它不再是模板),因此必须将其标记为inline或在 .cpp 文件中定义以避免多个定义错误,只需与任何其他函数定义一样。

于 2011-03-24T09:50:25.827 回答
15

问题如下:全模板特化不再是模板,更像是一个普通的函数。所以你应该采取相应的行动:

  • 要么把定义func<int>()放在 cpp 文件中

  • 或使其内联

于 2011-03-24T09:50:54.750 回答