【问题标题】:Why does the word 'typedef' need 'typename' after it for dependent types?为什么“typedef”这个词在依赖类型之后需要“typename”?
【发布时间】:2014-02-07 10:22:58
【问题描述】:

依赖类型通常需要typename 告诉编译器成员是一个类型,而不是函数或变量。

但是,并非总是如此。
例如,基类不需要这个,因为它只能是一个类型:

template<class T> struct identity { typedef T type; }
template<class T> class Vector : identity<vector<T> >::type { };  // no typename

现在我的问题是,为什么typedef 之后需要typename

template<class T> class Vector
{
    typedef typename /* <-- why do we need this? */ vector<T>::iterator iterator;
};

【问题讨论】:

  • 为什么不问同样的问题,例如static?
  • @n.m.:哦,对不起,我现在明白了。是的,我没有想到这一点,虽然我认为这可能是因为默认隐含的...所以static x; 默认情况下会是int,不是吗? (或者至少它会在 C 中?)但老实说不确定,这是一个好问题。
  • C 在大约 15 年前也放弃了隐式 int :)

标签: c++ typedef typename


【解决方案1】:

typedef 不需要出现在类型之前。

template <typename T>
struct S { typedef T type; };
template <typename T>
void f() { typename S<T>::type typedef t; }

这是完全有效的,在这种情况下,我希望你能理解如果typename 是可选的,解析会很复杂。

我能理解

template <typename T>
void f() { typedef S<T>::type t; }

可以有不同的解释,但这会引入意想不到的情况,即typedef 关键字的位置突然变得重要。

【讨论】:

  • 当然,但是没有人说当typedef 稍后出现时它应该是可选的,对吧?
  • @Mehrdad 我引用你的问题:“现在我的问题是,为什么 typedef 需要 typename?”
  • 您应该阅读标题,“为什么typedef 这个词需要typename 在它之后 用于依赖类型”?如果这不是你要回答的问题,那么它并没有真正回答我的问题......
  • @Mehrdad 在这种情况下,也许是因为让它依赖于 typedef 关键字的位置会更糟?
  • typedef S&lt;T&gt;::type t; 怎么会有不同的解释呢? S&lt;T&gt;::type 在这里只能是一个类型,表达式才有效
猜你喜欢
  • 2020-09-11
  • 2020-02-24
  • 2010-11-10
  • 2017-02-15
  • 1970-01-01
  • 2020-01-12
  • 2017-06-10
  • 2018-12-10
  • 2014-05-17
相关资源
最近更新 更多