即使使用typename关键字,typedef抛出错误

时间:2016-10-08 07:14:52

标签: c++ typedef

以下C ++代码:

false

表示:

  
    

缺少类型说明符 - 假设为int。注意:C ++不支持default-int

  

我搜索了错误消息,每个人都建议将template<typename State> class Node { public: typedef typename State::Move Move; ... } 关键字添加到typename行,在我的情况下已经存在。我该怎么办?

1 个答案:

答案 0 :(得分:0)

感谢所有帮助过的人。问题确实存在于其他地方。让我解释一下:

在C#中,我们在类定义中使用泛型(它们是C ++模板系统的粗略等价物)并且可以对它们应用约束:

class Node<T> where T:SomeClass { ... }

允许我们在这个类中实例化T类型的对象。这些对象将自动拥有SomeClass的所有成员。你获得了很好的智能感知作为奖励。关于这个系统的好处是可以在编译时验证这个类的完整性,而无需我们实例化Node<T>类型的对象。

[免责声明:以下是我的理解。如果我错了,请纠正我。]

C ++不会这样工作。 C ++将允许您访问模板参数的任何内容(在我的情况下,它是State::Move)。模板化的类本身并不能确保模板参数实际上具有名为Move的成员。只有在实例化模板化类的对象(例如Node<SomeType> x;)时,它才能确保SomeType必须包含名为Move的成员,并且如果不是这种情况则抛出错误。

在我的问题中,我正在实例化一个Node的对象,并将int作为模板参数传递给它,这显然没有任何名为Move的成员,所以它抱怨(不幸的是指向一个非常错误的地方,但这是另一个故事)。用适当的类型替换它为我修复了错误。

希望这可以帮助有人在路上。