在模板中使用 typedef 和 typename

Rob*_*ugs 5 c++ templates typedef derived typename

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

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;
};
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

template <class T>
class CDerived : public CBase<typename T::ElementType1>
{
 //...
};
Run Code Online (Sandbox Code Playgroud)

并声明如下对象:

typedef CDerived<CA> MyNewClass;
Run Code Online (Sandbox Code Playgroud)

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

typedef typename T ElementType1;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*tos 5

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