当您声明模板特化时,语法与(1)和没有尖括号(2)的区别是什么。
如果没有提供方法的实现(定义)(如本例所示)并且版本2按预期工作时错误:k
,则为什么版本1会失败?
undefined reference to int f<int>(int)
我看过this answer,但没有明确说明这些不同语法之间的区别。
答案 0 :(得分:3)
您只是混淆了显式实例化和模板专业化。
No1是模板spcialization ,意味着您要为具有给定类型的模板定义特殊版本,因此您必须为其提供可能不同的定义。
No2是显式实例化,意味着您希望编译器明确地使用给定类型实例化模板。它将基于主模板生成。
显式实例化定义强制实例化 他们所指的功能或成员功能。它可能出现在 在模板定义之后的任何地方编程,并为给定的程序 argument-list,只允许在程序中出现一次。
显式实例化声明(extern模板)阻止 隐式实例化:否则会导致的代码 隐式实例化必须使用显式实例化 定义在程序的其他地方提供。
explicit (full) template specialization:
允许为给定的一组模板参数自定义模板代码。
答案 1 :(得分:0)
在第一种情况下,你告诉编译器专门化模板函数(说“int类型的模板不同”),但是你没有提供专门的函数定义,因此“未定义的参考”。这个错误几乎总是意味着:“你声明了一个函数,在其他地方使用它,并没有定义它”。