【发布时间】:2015-07-25 15:59:03
【问题描述】:
我在使用 auto 和 dynamic_cast 时遇到了一个非常奇怪的行为。 这是我的类层次结构:
class BaseInterface {
public:
virtual void someMethod()=0;
};
class Derived:public BaseInterface {
public:
virtual void someMethod1()=0;
void someMethod()override;
};
当然还有一些类实现了所有派生方法。
然后是第三个类,如下所示:
class ThirdClass {
public:
void demoMethod(BaseInterface&);
void anotherMethod(Derived&);
};
void ThirdClass::demoMethod(BaseInterface& obj) {
auto buffer=dynamic_cast<Derived&>(obj);
anotherMethod(buffer);
}
当我用 gcc 编译它时,我得到一个“无法分配抽象类型的对象”错误。而当我更换时
auto buffer=...
与
Derived& buffer=...
一切编译正常。为什么会这样?是 auto 没有推断出正确的类型吗?
我还发现了一个仍然使用自动的肮脏技巧:
void ThirdClass::demoMethod(Base& obj) {
auto buffer=dynamic_cast<Derived*>(&obj);
anotherMethod(*buffer);
}
【问题讨论】:
-
我猜
auto推断出Derived buffer的类型,而不是Derived& buffer。 -
您使用的是什么版本的 g++?可以很好地编译您的代码[在修复琐碎的拼写错误之后,例如
demoMethod上没有返回类型,derived上没有继承] - clang++ 3.7(大约两周前)和 g++ 4.9.2。 -
@MatsPetersson:如果丢失的返回类型已修复,则无论使用何种编译器 ideone,它都会以报告的方式失败:ideone.com/UEtfui
-
@BillLynch:当代码在您尝试它和下一个尝试它的人之间发生变化时总是很好...... ;)
-
@BillLynch:仅供参考,将鼠标悬停在“C++14”上以查看它使用的编译器(作为记录,在撰写本文时它是 GCC 4.9.2)。
标签: c++ c++11 reference auto dynamic-cast