我想在模板类中定义一个类型名称,我可以在其他地方使用它来引用类中成员的类型。
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;
显然,编译器期望在类型名之后有一个限定名称,但我看不出模板类型怎么会有这样的名称。
在这种情况下,我不明白 ElementType1 和 ElementType2 之间的区别。
我看了很多关于堆栈溢出的问题,但在我的示例中,大多数问题似乎只涉及像 iterator_type 这样的声明。
最佳答案
编译器已经知道 T
是一个类型(class T
),所以在第一种情况下你不需要 typename
限定符. OTOH,编译器事先并不知道 T::ElementType1
是一种类型;这取决于 T 最终是什么。
关于c++ - 在模板中使用 typedef 和 typename,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472497/