c++模板全专门化语法
C++ template full specialization syntax
当你声明模板特化时,有(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类型的模板是不同的"),但您没有提供专门化函数定义,因此"未定义引用"。此错误通常意味着:"您声明了一个函数,在其他地方使用了它,并且没有定义它"。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 是否可以对零模板参数进行模板专门化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 尝试根据类中 typedef 的存在来专门化模板函数
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- c++模板专门化语法
- 显式模板专门化的语法
- 模板专门化GCC的语法错误,但MSVC没有
- c++模板全专门化语法
- 需要语法帮助来专门化基于模板参数类型的类方法
- c++中专门化函数模板的语法
- 模板专门化语法错误?不确定
- 定义模板方法专门化的正确语法是什么?