C++ 为什么模板参数不允许';typename';在参数列表之后 模板类型名?
当使用模板模板语法(如C++ 为什么模板参数不允许';typename';在参数列表之后 模板类型名?,c++,templates,c++11,language-lawyer,typename,C++,Templates,C++11,Language Lawyer,Typename,当使用模板模板语法(如模板)时,需要使用关键字类,因为使用类型名会产生以下错误: 错误:模板参数在参数列表后需要“类” 在其他地方,关键字typename和class在声明模板参数的基本情况下是可互换的 您可以争辩说,使用模板模板时的要求暗示您需要传递一个类类型,但情况并非总是如此(尤其是在C++11引入模板类型别名之后) template//'class'关键字为必填项。 结构Foo{ 使用类型=T; }; 模板 使用type=T(*)(); 使用func_ptr_t=Foo::type;
模板
)时,需要使用关键字类
,因为使用类型名
会产生以下错误:
错误:模板参数在参数列表后需要“类”
在其他地方,关键字typename
和class
在声明模板参数的基本情况下是可互换的
您可以争辩说,使用模板模板时的要求暗示您需要传递一个类类型,但情况并非总是如此(尤其是在C++11引入模板类型别名之后)
template//'class'关键字为必填项。
结构Foo{
使用类型=T;
};
模板
使用type=T(*)();
使用func_ptr_t=Foo::type;
这背后的原因是什么?
- 模板声明中不允许使用
有什么具体原因吗typename
《C++标准》对此有何评论?
class
。
此外,关键字typename
意味着模板参数是对任意类型的替换,而不是模板,因此在该上下文中使用typename
只会模糊类型名称和(类)模板之间的界限。
这是可以理解的
如今,此类参数可以是类模板或别名模板的名称,而且由于这些模板甚至没有远程连接,因此关键字
class
的实施或多或少已经过时。该提案选择使用C++1Z对此进行更改。简短回答:因为
< Stase>较长的回答< /强>:在标准化之前,C++模板需要所有模板参数的
。但是,在C++98中,模板参数只能是类类型,这就是为什么没有在该上下文中添加typename
关键字的原因typename
template<typename T> struct A {};
template<typename T> using B = int;
template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here
模板结构A{};
使用B=int的模板;
模板结构C;
C在模板参数
中标题为“允许<代码>类型名”,并建议精确地允许
使用
-std=c++1z
标志。现在有一个建议允许typename
。我更惊讶的是它不允许struct。现在允许模板中的typename模板参数在提问之前(2014年6月6日)给出了此答案的可能副本(2014年5月31日)。这怎么可能呢?@Walter它是从合并而来的。@T.C.嗯。为什么合并后的问题会将第一个问题标记为重复的问题(因此无法对其进行表决),而不是第二个问题?请注意,存在相同内容的偶数。它是否也应该合并?Visual Studio 2015现在也支持N4051(刚刚选中)。
template<typename T> struct A {};
template<typename T> using B = int;
template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here