c++ - 在模板中使用 typedef 和 typename

标签 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;
};

并像这样使用它:

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/

相关文章:

c++ - 嵌套 vector 与连续数组的性能影响

c++ - 如何在任意依赖类型上专门化模板

c# - 使用 C# 编辑 HTML 并替换其中的某些文本

c - 是否有 typedef 函数指针的替代语法?

c++ - 使用 decltype 将其转换为 const

c++ - 在可以使用 fopen 访问的 exe 中嵌入文本文件

c++ - 错误 : expected ')' before 'data'

c++ - 类型名称不允许输出MIDI文件值

c++ - sizeof(streamsize) 使用 Visual Studio 2012

c++ - 我正在尝试将像素数据转换为 OpenCV Mat 对象