在什么情况下,"name"必须以"typename"为前缀?

In what cases a "name" has to be prefixed with "typename"?

本文关键字:typename 前缀 情况下 name 在什么      更新时间:2023-10-16

可能重复:
我必须把";模板";以及";typename";依赖名称?

我只知道使用它们的两种情况(我认为这是模板参数依赖性,但我只知道这两种形式(:

  • 在参数列表中,即<typename T>
  • typename X::Sub_type Xx

那么,还有更多的案例,或者这一切背后有一些理论?

您需要typename关键字来引用名称依赖于模板参数的类型。依赖性的确切规则并非微不足道,但基本上,任何类型或模板参数内部的任何类型,或任何模板的实例化(其中一个参数指向您自己的模板(都是依赖的。

template <typename T, int I>
struct test {
   typename T::x x;                  // internal to your argument
   typename other_template<T>::y y;  // to the instantiation of your template with an argument
   typename another_tmpl<I>::z z;    // even if the template argument is not a type
};

1>这不是真正的原因,因为您可以简单地编写<class T>作为替换。

<typename T>

2> 这就是typename背后的真正原因,在限定的依赖类型之前需要它。

template <class T>
void foo() {
   typename T::iterator * iter;
   ...
}

这里没有typename,有一个C++解析规则说,即使会导致语法错误,合格的依赖名称也应该被解析为非类型。