模板类内部的Typedef-type给出编译错误

Typedef-type inside template class gives compile error

本文关键字:编译 错误 Typedef-type 内部      更新时间:2023-10-16

真实代码,剥离为最简单的相关部分:

第三方代码
template<class T>
class Ptr
{
private:
    typedef Ptr this_type;
public:
    typedef T element_type;
};

typedef Ptr<DataSet> DataSetPtr;

My Code - GPtr.h

template<class BaseType>
class GPtr
{
    ///force BaseType to be a Ptr or subclass
    typedef BaseType::element_type WrappedType;
public:
    ...
};

如果我删除对BaseType::element_type的引用,它编译得很好,但有了它,我得到编译警告/错误:

  • 警告C4346: 'BaseType::element_type':依赖名称不是类型前缀,使用'typename'表示类型
  • 错误C2146:语法错误:标识符"WrappedType"之前缺少";"

我甚至没有在我的代码中使用 GPtr作为特定的模板类型…仅仅包含gptr.h就会导致这个问题。

怎么了?

您必须使用typename消歧器:

typedef typename BaseType::element_type WrappedType;
//      ^^^^^^^^^

如果没有它,编译器不会将element_type解析为类型的名称。