函数模板特化编译错误

hid*_*yat 19 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());
Run Code Online (Sandbox Code Playgroud)

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

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

ild*_*arn 32

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

  • @hidayat:重载分辨率优先是唯一的区别 - 非模板总是优先于模板(见13.3.3).Herb Sutter在"More Exceptional C++"一书中详细介绍了这一点. (4认同)

Ale*_*tov 12

问题如下:完全模板专业化不再是模板,它更像是普通的功能.所以你应该采取相应行动:

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

  • 或使其内联