函数模板特化编译错误

时间:2011-03-24 09:43:10

标签: c++ templates template-specialization

##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());

我得到的错误是:错误LNK2005:“void __cdecl func(int)”(?? $ func @ H @@ YAXH @ Z)已在A.obj中定义, 找到一个或多个多重定义的符号

功能模板专业化不被视为普通功能模板吗?看起来它将出现在A的目标文件中。

2 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:11)

问题如下:完整模板专业化不再是模板,它更像是普通函数。所以你应该采取相应的行动:

  • func<int>()的定义放在cpp文件

  • 或将其设为内联