1

我有一个包含类 Car 的实例的类 Tran。如果程序包含typenamebefore typedef,则会产生错误:“expected nested-name-specifier before 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;
}
4

2 回答 2

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

希望这可以帮助!

于 2013-04-17T02:46:44.670 回答
2

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

于 2013-04-17T02:47:19.960 回答