在C ++中生成typename和typedef相关错误的模板类?

时间:2013-04-17 02:44:36

标签: c++ templates inheritance

我有一个包含Car类实例的Tran类。如果程序在typename之前包含typedef,则会产生错误:“typedef之前的预期嵌套名称说明符”。如果它不包含typename,则会产生错误:“在'Tran :: CarType :: Model'之前需要'typename',因为'Tran :: CarType'是一个依赖范围”。是什么导致了这个问题?

#include "Car.hpp"

template<typename A, typename B, typename C>
class Tran {

    public: 
    typedef Car<A, B> CarType;  //compilation error
    typedef CarType::Model M;   //compilation error

private: 
CarType myCar;
}

2 个答案:

答案 0 :(得分:4)

问题在于这一行:

typedef CarType::Model M;

请注意CarType定义为

typedef Car<A, B> CarType;

请注意,CarType取决于AB是什么。实际上,由于这个原因,它被称为依赖类型

在C ++中,如果要访问嵌套在依赖类型中的类型,则必须明确告诉编译器您正在查找依赖类型内部以获取其他类型的名称。因此,这一行是错误的:

typedef CarType::Model M;

因为没有迹象表明Model是类型名称。要解决此问题,请将行更改为“

typedef typename CarType::Model M;

此处,typename关键字向C ++表明Model是嵌套在依赖类型CarType内的类型的名称。

希望这有帮助!

答案 1 :(得分:2)

正确的顺序是typedef typename,而不是相反。您只需要在第二个声明中,因为它是一个从属名称,编译器在查找的第一阶段无法知道CarType::Model是什么。