【问题标题】:function template specialization compile error函数模板特化编译错误
【发布时间】:2011-07-21 23:50:04
【问题描述】:
##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 的目标文件中。

【问题讨论】:

  • func2 和它有什么关系?
  • 从您的错误消息中,我假设您使用 VC。你的程序对我来说在 VS2005 上运行良好
  • @Space_C0wb0y 所以我有一些东西要放在 A.cpp 文件中
  • 我正在使用 Visual Studio 2010

标签: c++ templates template-specialization


【解决方案1】:

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

【讨论】:

  • 但是如果将其视为普通函数,那么与重载函数有什么区别:inline void func(int t) {}
  • @hidayat :重载解决优先级是唯一的区别——非模板总是优先于模板(参见 13.3.3)。 Herb Sutter 所著的“More Exceptional C++”一书中对此进行了详细介绍。
【解决方案2】:

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

  • 要么把func&lt;int&gt;()的定义放在cpp文件中

  • 或使其内联

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多