1

厳密に型指定された列挙型を使用する場合、継承の問題に本当に苦労していますが、継承を介して使用すると、列挙型があいまいなようです。

g ++(GCC)4.7.2を使用しています

enum class AE { V1 };
enum class BE { V2 };
enum class CE { V3 };

struct A { void set(AE enumval) { } };
struct B { void set(BE enumval) { } };
struct C { void set(CE enumval) { } };
struct combined : A, B, C { };

struct all_in_one {
    void set(AE enumval) { }
    void set(BE enumval) { }
    void set(CE enumval) { }
};

void function()
{
    combined inherited_obj;

    // compile errors - ambigious funtion call
    inherited_obj.set(AE::V1);
    inherited_obj.set(BE::V2);
    inherited_obj.set(CE::V3);


    all_in_one simple_obj;

    // works like a charm...
    simple_obj.set(AE::V1);
    simple_obj.set(BE::V2);
    simple_obj.set(CE::V3);
}

なぜこのように動作しないのか、情報が見つかりません。明らかな何かが欠けていますか?

4

1 に答える 1

4

オーバーロードの解決が機能するには、関数が同じスコープ内にある必要があります。それらを自分で共通のスコープにする必要があります。

struct combined : A, B, C
{
    using A::set;
    using B::set;
    using C::set;
};

デモ

またはスコープを明示的に指定します。

inherited_obj.A::set(AE::V1);
inherited_obj.B::set(BE::V2);
inherited_obj.C::set(CE::V3);
于 2015-09-03T10:11:25.493 に答える