2016-03-19 12 views
-1

これはコンパイラのバグか何かがあると確信しています。異なる変換単位の2つの型が同じ名前を持ち、テンプレートクラスのネストされたクラスから派生する場合、dynamic_castはそれらの翻訳単位の1つで失敗します。ダイナミック型がキャスト型のオブジェクトの場合、dynamic_castが失敗する

私のケースでは、私はAという2つの異なるタイプを2つの翻訳単位(テストケース)で使用します。それぞれ、Aのオブジェクトobjがあります。 Aは、抽象基盤root_typeから派生したものです。 obj_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)です。あなたはstruct A二つの異なる定義を与えることによって、一つの定義ルール違反

+2

[mcve]を入力してください。 – Barry

+0

@Barryは依然としてreproを最小限に抑えます – Kietz

+0

'A'と' root_type'のコードを提供するべきではありません。 'root_type'が多型でなければ' dynamic_cast'は使用できないからです。 –

答えて

0

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

をので、あなたのプログラムの動作は未定義おり、コンパイラが問題を診断するために必要とされていません。

+0

うん、そうだった。私はこれらのクラスを 'namespace {}'に入れておきます(これは修正する必要があります)。私はまだコンパイラが私に何かエラーを与えていないのに驚いています... – Kietz

+0

@Kietz:どうしてこのエラーを検出しますか?異なる翻訳単位は完全に独立して翻訳されます。これは標準がこの違反の検出を必要としない理由です – AnT

+0

申し訳ありませんが、リンカエラー – Kietz

関連する問題