QT中QExplicitlySharedDataPointer执行dynamic_cast转换报错如何解决?
问题解答
错误根因
dynamic_cast语法要求转换的目标类型必须是原生指针或原生引用类型,你代码中EntityExtended::ConstPointer是QExplicitlySharedDataPointer的别名,属于智能指针对象类型,不满足dynamic_cast的类型要求,因此触发编译报错。
正确实现方式
Qt的QExplicitlySharedDataPointer已经内置了动态类型转换的能力,有两种可行写法:
- 直接调用智能指针的内置
dynamicCast方法:
auto extendedEntity = entity.dynamicCast<const EntityExtended>();
- 先取出原生指针完成
dynamic_cast转换后,再封装回智能指针:
const Entity* rawPtr = entity.data(); const EntityExtended* extendedRawPtr = dynamic_cast<const EntityExtended*>(rawPtr); EntityExtended::ConstPointer extendedEntity(extendedRawPtr);
额外注意事项
- 基类
Entity必须定义虚析构函数或者其他虚函数,否则dynamic_cast无法执行运行时类型检查,同样会编译失败 - MSVC编译器需要开启RTTI(运行时类型信息)编译选项才能正常使用
dynamic_cast,Qt项目默认开启该选项,如果你手动关闭过需要重新打开
内容的提问来源于stack exchange,提问作者Klypto
相关产品推荐
相关产品推荐

