c++模板全专门化语法

C++ template full specialization syntax

本文关键字:专门化 语法 c++      更新时间:2023-10-16

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

如果方法的实现(定义)没有提供(像在这种情况下)错误:undefined reference to int f<int>(int)而版本2按预期工作,为什么版本1失败?

template <typename T> T f(T val) {
    return val;
}
template<> int f<int>(int val); // 1
template int f<int>(int val);   // 2
int main() {
    cout << f(555);
}

我看过这个答案,但是它没有明确地描述这些不同语法之间的区别

你把显式实例化模板特化搞混了。

No1是模板专门化,意味着你想为给定类型的模板定义一个特殊版本,所以你必须为它提供一个可能不同的定义。

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

显式实例化:

显式实例化定义强制实例化函数或它们引用的成员函数。它可能出现在程序在模板定义之后的任何地方,并为给定的参数列表,只允许在程序中出现一次。

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

显式(完整)模板特化:

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

在第一种情况下,您告诉编译器专门化模板函数(说"int类型的模板是不同的"),但您没有提供专门化函数定义,因此"未定义引用"。此错误通常意味着:"您声明了一个函数,在其他地方使用了它,并且没有定义它"。