C ++模板完全专业化语法

时间:2015-09-11 15:46:01

标签: c++ templates syntax template-specialization

当您声明模板特化时,语法与(1)和没有尖括号(2)的区别是什么。

如果没有提供方法的实现(定义)(如本例所示)并且版本2按预期工作时错误:k,则为什么版本1会失败?

undefined reference to int f<int>(int)

我看过this answer,但没有明确说明这些不同语法之间的区别。

2 个答案:

答案 0 :(得分:3)

您只是混淆了显式实例化模板专业化

No1是模板spcialization ,意味着您要为具有给定类型的模板定义特殊版本,因此您必须为其提供可能不同的定义。

No2是显式实例化,意味着您希望编译器明确地使用给定类型实例化模板。它将基于主模板生成。

Explicit instantiation

  

显式实例化定义强制实例化   他们所指的功能或成员功能。它可能出现在   在模板定义之后的任何地方编程,并为给定的程序   argument-list,只允许在程序中出现一次。

     

显式实例化声明(extern模板)阻止   隐式实例化:否则会导致的代码   隐式实例化必须使用显式实例化   定义在程序的其他地方提供。

explicit (full) template specialization

  

允许为给定的一组模板参数自定义模板代码。

答案 1 :(得分:0)

在第一种情况下,你告诉编译器专门化模板函数(说“int类型的模板不同”),但是你没有提供专门的函数定义,因此“未定义的参考”。这个错误几乎总是意味着:“你声明了一个函数,在其他地方使用它,并没有定义它”。