Роман Худобердин Asked:2020-09-12 04:31:57 +0000 UTC2020-09-12 04:31:57 +0000 UTC 2020-09-12 04:31:57 +0000 UTC 模板参数中的 typename 和 class 有什么区别? 772 我不太明白两者之间的区别: template <typename T> 和 template <class T> 如果它存在,那么它是什么? c++ 3 个回答 Voted Best Answer αλεχολυτ 2020-09-12T20:00:28Z2020-09-12T20:00:28Z 在现代,即 classC++17 版本的语言和typename模板之间没有区别。然而,在早期的标准中,使用模板模板(原文如此!)参数时差异是显而易见的,即 当模板类型用作模板参数时。在这种情况下,typename在名称之前使用泛型类型是无效的。 模板函数示例f(只需要取消注释一行): //template<template<typename> class C> // любой с++ //template<template<class> class C> // любой с++ //template<template<class> typename C> // начиная с c++17 //template<template<typename> typename C> // начиная с c++17 void f() { } 如果您告诉现代编译器使用旧版本的标准,您可能会收到如下消息: 使用 'typename' 的模板模板参数是 C++17 扩展 [-Wc++17-extensions] 在使用 c++17 之前的模板模板参数时(特别是在 c++11 第 14.1/1 节中),由于以下语法定义而出现上述限制: template < template-parameter-list > class ...opt identifieropt template < template-parameter-list > class identifieropt = id-expression 这里明确提到了这个词class。 在 c++17 中(草案N4687 p.17.1/1): template < template-parameter-list > type-parameter-key ...opt identifieropt template < template-parameter-list > type-parameter-key identifieropt = id-expression 显式已class替换为type-parameter-key,其扩展如下: type-parameter-key : class typename 因此,typename可以与 结合使用class。 n3r0bi0m4n 2020-09-12T05:24:29Z2020-09-12T05:24:29Z C++ 标准规定如下 [条款 14.1.2]: 模板参数中的类和类型名之间没有语义差异。 AR Hovsepyan 2020-02-26T17:09:35Z2020-02-26T17:09:35Z 因此,您可以创造写作、阅读和感知的便利。例如: template < class Cont > void show(const Cont& cont, std::ostream& out) {} 它立即引起您的注意,该参数是一个容器类,并且该函数很可能输出到 out容器的内容。在这种情况下,这个词template对于感知不是那么有效。但: template<typename Tp, typename Sequence = std::deque<Tp> > class stack{}; 这里比较容易理解,Tp这是栈元素的类型,还有Sequence一个实现属性(这里创建了它的适配器)。
在现代,即
classC++17 版本的语言和typename模板之间没有区别。然而,在早期的标准中,使用模板模板(原文如此!)参数时差异是显而易见的,即 当模板类型用作模板参数时。在这种情况下,typename在名称之前使用泛型类型是无效的。模板函数示例
f(只需要取消注释一行):如果您告诉现代编译器使用旧版本的标准,您可能会收到如下消息:
在使用 c++17 之前的模板模板参数时(特别是在 c++11 第 14.1/1 节中),由于以下语法定义而出现上述限制:
这里明确提到了这个词
class。在 c++17 中(草案N4687 p.17.1/1):
显式已
class替换为type-parameter-key,其扩展如下:因此,
typename可以与 结合使用class。C++ 标准规定如下 [条款 14.1.2]:
因此,您可以创造写作、阅读和感知的便利。例如:
它立即引起您的注意,该参数是一个容器类,并且该函数很可能输出到
out容器的内容。在这种情况下,这个词template对于感知不是那么有效。但:这里比较容易理解,
Tp这是栈元素的类型,还有Sequence一个实现属性(这里创建了它的适配器)。