模板类中的Typedef类型给出了编译错误

时间:2013-04-16 17:55:19

标签: c++ templates

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

第三方代码

template<class T>
class Ptr
{
private:

    typedef Ptr this_type;

public:

    typedef T element_type;
};

typedef Ptr<DataSet> DataSetPtr;

我的代码 - 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导致问题。

这里有什么问题?

1 个答案:

答案 0 :(得分:2)

您必须使用typename消歧器:

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

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