【问题标题】:typedef Using a typename [duplicate]typedef 使用类型名 [重复]
【发布时间】:2017-11-13 13:48:53
【问题描述】:

所以我有some code,我问了一个问题,我意识到这个问题令人困惑,后来被删掉了:

template <typename T>
struct foo {
    typedef typename pair<T, T> PointType;
private:
    PointType point;
};

我不确定typenamePointType 的定义中的作用是什么。这个关键字只是省略了吗?我注意到它经常在using 定义中用于在类型支持中添加*_t 扩展。也许这就是这里的意图?

【问题讨论】:

    标签: c++ templates metaprogramming typedef typename


    【解决方案1】:

    您正在使用第二种类型的类型名使用,根据 cppreference:http://en.cppreference.com/w/cpp/keyword/typename

    基本上,你是在给编译器一个提示:T 是一个依赖于模板的类型 pair&lt;T, T&gt;

    【讨论】:

      【解决方案2】:

      这是必要的,因为pair&lt;T, T&gt;dependent name,这意味着它会根据foo 的初始化方式而改变。

      【讨论】:

      • 你说它是依赖的,因为pair 也可能是一个变量模板?
      • @StoryTeller:从属名称早于日期变量模板。标准委员会担心经典设计的编译器在处理pair&lt;T, T&gt; PointType 时不会有类型信息,并且无法区分模板类型(正确答案)或pair &lt; TT &gt; PointType 这两个语句(假设pairTPointType 都是变量;不要忘记en.wikipedia.org/wiki/Comma_operator)。 typename 区分这两种可能性。
      • @MaxLybbert - 除了这个答案链接的页面中的示例之外,使用依赖名称作为类型,没有 typename 关键字
      • 在 90 年代后期,GCC 可以在没有 typename 的情况下得到正确答案,但是为 GCC 编译的代码无法为 Visual Studio 编译。 GCC 取出了扩展。然后 Visual Studio 添加了接受这种代码的能力。我真的不知道今天的情况如何。
      • @MaxLybbert 看起来该标准从未正式要求编译器等到模板中使用的类型在实现模板之前完全定义。要求它的唯一方法似乎是使用typename,因此这可以被视为“必需的typename”,即使现代编译器都自己解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2012-06-28
      相关资源
      最近更新 更多