C++ 简单类型说明符是模板参数

C++ 简单类型说明符是模板参数,c++,language-lawyer,C++,Language Lawyer,根据ISO 14882:2011§14.6.2.1: 如果类型为-模板参数,则该类型为从属类型 根据§ISO 14882:2011 14.6: 模板声明或定义中使用的名称,即 假定依赖于模板参数不会命名类型,除非 适用的名称查找查找类型名称或名称为限定名称 通过关键字typename 但是 模板类U { typename T;//格式错误,我有一个编译器错误 }; “依赖名称”和“模板声明或定义中使用的名称以及依赖于模板参数的名称”是同一概念吗? 我试图解决我的误解,因为它看起来像是标准(IS

根据ISO 14882:2011§14.6.2.1:

如果类型为-模板参数,则该类型为从属类型

根据§ISO 14882:2011 14.6:

模板声明或定义中使用的名称,即 假定依赖于模板参数不会命名类型,除非 适用的名称查找查找类型名称或名称为限定名称 通过关键字typename

但是

模板类U
{
typename T;//格式错误,我有一个编译器错误
};
“依赖名称”和“模板声明或定义中使用的名称以及依赖于模板参数的名称”是同一概念吗?
我试图解决我的误解,因为它看起来像是标准(ISO 14882:2011§14.6.2.1)中的断言和标准T中的示例之间的冲突

由于ISO第17.7.3节(),
T
不是
嵌套名称说明符,因此示例代码的格式不正确

因此,
T
除了用作模板参数的
typename T
之外,没有其他方法。也就是说,编译器不会出错,因此您不需要使用
类型名说明符来限定它

需要
typename说明符的依赖类型的一个例子是
T::value\u type
,因为
value\u type
的实际类型/值取决于
T
是什么。在这种情况下,您必须帮助编译器:

template <typename T> class U {
  using t = T;                      // OK
  using u = T::value_type;          // ill-formed: needs typename-specifier
  using v = typename t::value_type; // OK: qualified with typename keyword
};
这就是上面第二行typedef格式不正确的原因:如果
T
foo
那么
value\u type
实际上不是一个类型,而是一个名称非常混乱的常量。如果
T
bar
,则一切正常。但是编译器不知道这一点,所以你必须帮助他,并确保他
value\u type
实际上是一个类型。这也意味着,如果您试图编译
U
,将遇到编译错误


注意:我对typedefs使用了C++11语法,因为我发现它更具可读性。如果您使用
typedef
而不是
使用

实际问题是什么?
typename T
格式不正确,因为.Grammar不要求typename到处都嵌套名称说明符,这是强制使用typename的唯一特殊情况。在许多情况下,需要typename,但不应用嵌套的名称说明符。例如,席西试图解决我的误解,因为它看起来像标准中的2个断言之间的冲突。更确切地说,标准149:2011 2011年第14条2.2.1条和标准:T t;“
T
在您的示例中不是从属名称。”为什么?根据ISO 14882:2011§14.6.2.1:如果类型是-模板参数,则该类型为从属类型,并且从属类型是符合标准的从属名称。请根据ISO 14882I获得错误证明您的答案。参见wandbox.org/permlink/FIMBqI579385nbhy您如何解释标准断言:14882:2011§14.6.2.1:如果类型是-模板参数,则该类型是依赖的?我在类范围中得到了相同的结果:我尝试解决miisunderstanding,因为标准中的一些断言(如上所示)看起来是矛盾的。
template <typename T> class U {
  using t = T;                      // OK
  using u = T::value_type;          // ill-formed: needs typename-specifier
  using v = typename t::value_type; // OK: qualified with typename keyword
};
class foo {
  constexpr static int value_type = 7;
}

class bar {
  using value_type = int;
}