【问题标题】:Using typedef and typename inside a template在模板中使用 typedef 和 typename
【发布时间】:2011-12-12 09:52:25
【问题描述】:

我想在模板类中定义一个类型名称,我可以在其他地方使用它来引用该类中成员的类型。

template <class T>
class CA
{
public:
    //typedef typename T::iterator iterator_type;
    typedef typename T ElementType1; // compile error on this line
    //typedef T ElementType2;

    T m_element;
};

并像这样使用它:

template <class T>
class CDerived : public CBase<typename T::ElementType1>
{
 //...
};

并声明如下对象:

typedef CDerived<CA> MyNewClass;

这不可能吗?我有一些代码可以在 VS2010 下正确编译,但不能在使用该行的 Xcode 下编译:

typedef typename T ElementType1;

显然编译器希望在 typename 之后有一个限定名称,但我不明白模板类型怎么会有一个。

我不明白 ElementType1 和 ElementType2 在这种情况下的区别。

我查看了很多关于堆栈溢出的问题,但大多数问题似乎只涉及我的示例中的 iterator_type 之类的声明。

【问题讨论】:

    标签: c++ templates typedef derived typename


    【解决方案1】:

    编译器已经知道T 是一个类型(class T),所以在第一种情况下你不需要typename 限定符。 OTOH,编译器事先并不知道T::ElementType1 是一个类型;这取决于 T 最终是什么。

    【讨论】:

    • 好酷,回答我的问题,我只需要使用typedef T ElementType。真的,我不确定 typename 是否应该在那里。我了解它在CBase&lt;typename T::ElementType&gt; 中的用途。这是有关类型名称link 的更多信息。似乎 VS2010 接受 ElementType1 声明,但可能不接受 gcc。
    【解决方案2】:

    typename 只能用于限定限定名;它没有 应用紧随其后的名称,但应用于限定名称, 即在:

    typedef typename T::X x;
    

    typename 适用于X,而不适用于T。为此,它 仅在限定名称之前是合法的(在此使用中)。非限定名称 必须在编译器可以知道名称是否为 类型与否。 (实际上,这只是在定义的类型中的一个问题 依赖的基类,这些可以被限定。)

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多