-1

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

第三方代码

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 会导致问题。

这里有什么问题?

4

1 回答 1

2

您必须使用typename消歧器:

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

没有它,编译器将不会解析element_typetype的名称。

于 2013-04-16T17:57:36.913 回答