错误:从'Layer'类型的表达式初始化'LineLayer&'类型的引用无效

时间:2014-08-02 19:08:37

标签: c++ compiler-errors

我的编译器抱怨这一行:

LineLayer&安培; lastLayer = * this-> layers.back();

error: invalid initialization of reference of type ‘LineLayer&’ from expression of type ‘Layer’

所以他说,他不能初始化LineLayer& lastLayer reference from *this->layers.back(),它是Layer *对象的一个​​向量(LineLayer的基类)。

取消引用指针并将其指定给子类的引用是不是没有问题?

2 个答案:

答案 0 :(得分:2)

可以完成,但不能隐式。这是为了保护您免受不受欢迎的转换,因为并非每个Layer都是LineLayer。要在确定确认有效时执行此转化,请使用static_cast

LineLayer& lastLayer = static_cast<LineLayer&>(*this->layers.back());

如果您不确定Layer是否为LineLayer,请使用dynamic_cast。如果不是std::bad_cast,则会抛出LineLayer& lastLayer = dynamic_cast<LineLayer&>(*this->layers.back());

{{1}}

另一种方式---从派生到基础---不需要演员,而是隐式执行,因为它是一种安全的转换。

答案 1 :(得分:0)

“取消引用指针并将其指定给子类的引用是不是没有问题”?子类???不,当然,它不应该是“好的”。你怎么知道那个指针最初是否指向该子类的对象?也许它指的是一个完全不同的子类的对象。在这种情况下,您认为它如何运作?

如果您确定目标对象具有正确的子类类型,则必须明确告诉编译器您确实要执行此危险转换。您必须使用static_cast强制转换。或者,如果基类是多态的,则可以使用dynamic_cast

当然,这里真实的(隐含的)问题是你为什么要这样做。你真的需要LineLayer &类型的参考吗?或者,也许,Layer &类型的引用也可以正常工作?没有办法从你发布的内容中回答这个问题。