これはコンパイラのバグか何かがあると確信しています。異なる変換単位の2つの型が同じ名前を持ち、テンプレートクラスのネストされたクラスから派生する場合、dynamic_castはそれらの翻訳単位の1つで失敗します。ダイナミック型がキャスト型のオブジェクトの場合、dynamic_castが失敗する
私のケースでは、私はA
という2つの異なるタイプを2つの翻訳単位(テストケース)で使用します。それぞれ、A
のオブジェクトobj
があります。 A
は、抽象基盤root_type
から派生したものです。 obj_ref
はタイプroot_type&
であり、obj
にバインドされています。 obj_ref
をA&
にキャストしようとすると、std::bad_cast
がスローされます。
#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)です。あなたはstruct A
二つの異なる定義を与えることによって、一つの定義ルール違反
[mcve]を入力してください。 – Barry
@Barryは依然としてreproを最小限に抑えます – Kietz
'A'と' root_type'のコードを提供するべきではありません。 'root_type'が多型でなければ' dynamic_cast'は使用できないからです。 –