2011-03-24 71 views
14
##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: “无效__cdecl FUNC(INT)”(?? $ FUNC 3 H @@ YAXH @ Z)在A.OBJ已经定义, 一个或多个定义的符号发现函数模板专业化编译错误

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

+0

是什么'func2'有什么关系呢? – 2011-03-24 09:48:58

+0

从你的错误信息我假设你使用VC。你的程序对VS2005工作正常 – mkaes 2011-03-24 09:49:51

+0

@ Space_C0wb0y所以我有一些东西要放在A.cpp文件中 – hidayat 2011-03-24 09:51:31

回答

26

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

+1

但是,如果它被当作普通函数处理,那么与重载函数的区别是什么: inline void func(int t){} – hidayat 2011-03-24 10:04:08

+4

@hidayat:重载解析优先是唯一的区别 - 非模板总是优于模板(见13.3.3)。 Herb Sutter在“More Exceptional C++”一书中详细介绍了这一点。 – ildjarn 2011-03-24 10:08:39

10

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

  • 在CPP文件

  • func<int>()要么把定义或使其内嵌