函数模板特化编译错误

发布于 2024-10-26 06:29:10 字数 356 浏览 1 评论 0原文

##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 的目标文件中。

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

The error I get is: error LNK2005: "void __cdecl func(int)" (??$func@H@@YAXH@Z) already defined in A.obj,
one or more multiply defined symbols found

Is a function template specialization not treated as a normal function template? It looks like it will be in the objective file for A.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放飞的风筝 2024-11-02 06:29:10

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

As template<> void func<int>(int t) {} is a function overload rather than a function template (i.e., all types are known at the point of definition so it is no longer a template), it must be marked as inline or defined in a .cpp file to avoid multiple definition errors, just as with any other function definition.

梦里人 2024-11-02 06:29:10

问题如下:完整的模板特化不再是一个模板,它更像一个普通函数。因此,您应该采取相应的行动:

  • 要么将 func() 的定义放在 cpp 文件中

  • 或使其内联

The problem is as follows: full template specialization is no more a template, it's more like an ordinary function. So you should act accordingly:

  • either put definition of func<int>() in cpp file

  • or make it inline

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文