dynamic_cast对于动态类型为强制类型的对象失败

基茨

我可以肯定这是一个编译器错误或诸如此类的问题:如果不同翻译单元中的两种类型具有相同的名称,并且是从模板类的嵌套类派生的,则dynamic_cast将在其中一个翻译单元中失败。

就我而言,我使用以A两个翻译单元命名的两种不同类型(它们是测试用例)。在每个对象obj,我都有一个类型的对象AA源自抽象基础root_typeobj_ref具有类型root_type&,并绑定到obj试图投obj_refA&std::bad_cast

mixin.hpp
#pragma once
template <typename... Types>
struct mixin
{
    struct root_type
    {
        virtual ~root_type() = default;
    };
};
use_AB.cpp
#include "mixin.hpp"
struct A;
struct B;
struct A : mixin<A, B>::root_type{};

void use_AB()
{
    using root_type = mixin<A, B>::root_type;
    A a;
    root_type &a_ref = a;
    dynamic_cast<A&>(a_ref);
}
use_A.cpp
#include "mixin.hpp"
struct A;
struct A : mixin<A>::root_type {};

void use_A()
{
    using root_type = mixin<A>::root_type;
    A a;
    root_type &a_ref = a;
    //////////////////////////////////////////
    dynamic_cast<A&>(a_ref); // throws - dynamic_cast failure
    //////////////////////////////////////////
}
main.cpp
void use_A();
void use_AB();

int main()
{
    use_A();
    use_AB();
    return 0;
}

这是怎么回事?

编译器为VisualStudio 2015(v140)。

Aschepler

通过提供struct A两个不同的定义,您违反了“一个定义规则”

struct A : mixin<A, B>::root_type{};
struct A : mixin<A>::root_type {};

因此,您的程序具有未定义的行为,并且不需要编译器来诊断问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

相同类型的Dynamic_cast对象

来自分类Dev

dynamic_cast类型检查功能是否无需强制转换?

来自分类Dev

Dynamic_cast 未显示正确的对象类型

来自分类Dev

游戏引擎:dynamic_cast - 对象类不是多态类型

来自分类Dev

TypeScript中类型区分强制转换的类型安全转换(例如C ++的dynamic_cast)

来自分类Dev

具有模板类“ dynamic_cast的无效目标类型”的dynamic_cast

来自分类Dev

C ++类型比较:typeid与双调度dynamic_cast

来自分类Dev

类型不完整的dynamic_cast问题

来自分类Dev

类型不完整的dynamic_cast问题

来自分类Dev

当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成空指针?

来自分类Dev

dynamic_cast更改原始对象?

来自分类Dev

为什么dynamic_cast可以用于非多态类型的上传?

来自分类Dev

dynamic_cast将“ this”转换为派生类型:什么时候合法?

来自分类Dev

dynamic_cast不适用于非多态类型的原因

来自分类Dev

未声明CLASS_NAME-无法dynamic_cast(目标不是指针或对完整类型的引用)

来自分类Dev

如何在没有dynamic_cast的情况下对派生类型实现“较少”?

来自分类Dev

Haxe:检查动态类型是否为对象

来自分类Dev

强制类型为元组

来自分类Dev

将对象强制转换为通用类型失败

来自分类Dev

dynamic_cast失败-取决于操作系统版本

来自分类Dev

dynamic_cast失败是什么意思?

来自分类Dev

dynamic_cast失败是什么意思?

来自分类Dev

无法dynamic_cast

来自分类Dev

dynamic_cast错误

来自分类Dev

未处理的异常:0x80000002:在Win CE上使用dynamic_cast时,数据类型未对齐

来自分类Dev

不能对const对象使用dynamic_cast

来自分类Dev

无法将类型为VB $ AnonymousDelegate的对象强制转换为类型System.Func

来自分类Dev

无法将类型为System.Int64的对象强制转换为类型为System.Int32的对象

来自分类Dev

_CastError(类型'_InternalLinkedHashMap <dynamic,dynamic>'不是强制类型转换中'Map <String,dynamic>'类型的子类型)

Related 相关文章

  1. 1

    相同类型的Dynamic_cast对象

  2. 2

    dynamic_cast类型检查功能是否无需强制转换?

  3. 3

    Dynamic_cast 未显示正确的对象类型

  4. 4

    游戏引擎:dynamic_cast - 对象类不是多态类型

  5. 5

    TypeScript中类型区分强制转换的类型安全转换(例如C ++的dynamic_cast)

  6. 6

    具有模板类“ dynamic_cast的无效目标类型”的dynamic_cast

  7. 7

    C ++类型比较:typeid与双调度dynamic_cast

  8. 8

    类型不完整的dynamic_cast问题

  9. 9

    类型不完整的dynamic_cast问题

  10. 10

    当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成空指针?

  11. 11

    dynamic_cast更改原始对象?

  12. 12

    为什么dynamic_cast可以用于非多态类型的上传?

  13. 13

    dynamic_cast将“ this”转换为派生类型:什么时候合法?

  14. 14

    dynamic_cast不适用于非多态类型的原因

  15. 15

    未声明CLASS_NAME-无法dynamic_cast(目标不是指针或对完整类型的引用)

  16. 16

    如何在没有dynamic_cast的情况下对派生类型实现“较少”?

  17. 17

    Haxe:检查动态类型是否为对象

  18. 18

    强制类型为元组

  19. 19

    将对象强制转换为通用类型失败

  20. 20

    dynamic_cast失败-取决于操作系统版本

  21. 21

    dynamic_cast失败是什么意思?

  22. 22

    dynamic_cast失败是什么意思?

  23. 23

    无法dynamic_cast

  24. 24

    dynamic_cast错误

  25. 25

    未处理的异常:0x80000002:在Win CE上使用dynamic_cast时,数据类型未对齐

  26. 26

    不能对const对象使用dynamic_cast

  27. 27

    无法将类型为VB $ AnonymousDelegate的对象强制转换为类型System.Func

  28. 28

    无法将类型为System.Int64的对象强制转换为类型为System.Int32的对象

  29. 29

    _CastError(类型'_InternalLinkedHashMap <dynamic,dynamic>'不是强制类型转换中'Map <String,dynamic>'类型的子类型)

热门标签

归档