Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么模板参数不允许';typename';在参数列表之后 模板类型名?_C++_Templates_C++11_Language Lawyer_Typename - Fatal编程技术网

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++标准》对此有何评论?
我在寻找这个限制背后的理性[…]

在引入C++11之前,可以传递给模板参数的唯一模板是模板。 这就是为什么强制使用关键字
class
。 此外,关键字
typename
意味着模板参数是对任意类型的替换,而不是模板,因此在该上下文中使用
typename
只会模糊类型名称和(类)模板之间的界限。 这是可以理解的


如今,此类参数可以是类模板或别名模板的名称,而且由于这些模板甚至没有远程连接,因此关键字
class
的实施或多或少已经过时。该提案选择使用C++1Z对此进行更改。

简短回答:因为

< Stase>较长的回答< /强>:在标准化之前,C++模板需要所有模板参数的类< /Cord>关键字。然而,为了强调模板也可以是非类(即内置)类型的事实,引入了另一个关键字

typename
。但是,在C++98中,模板参数只能是类类型,这就是为什么没有在该上下文中添加
typename
关键字的原因

输入C++11及其新功能,该功能现在还引入了非类模板,因此引入了非类模板参数:

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