对于动态类型为已转换类型

时间:2016-03-19 18:37:42

标签: c++ dynamic-cast

我很确定这是一个编译器错误或其他东西:如果不同翻译单元中的两个类型具有相同的名称并从模板类的嵌套类派生,则dynamic_cast将在其中一个翻译单元中失败。

就我而言,我在两个翻译单元中使用两个名为A的不同类型(它们是测试用例)。在每个中,我都有obj类型的对象AA源自抽象基础root_typeobj_ref的类型为root_type&,并且绑定到obj。试图将obj_ref投降至A&投掷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)。

1 个答案:

答案 0 :(得分:0)

您通过赋予struct A两个不同的定义来违反单一定义规则:

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

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