枚举类的二义继承

enum class ambiguous inheritance

本文关键字:继承 枚举      更新时间:2023-10-16

在使用强类型枚举时,我真的很纠结于继承问题——然而,在通过继承使用枚举时,这些枚举似乎是模棱两可的。

我使用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);
}

我找不到任何信息为什么它不应该这样工作。

两个函数必须在同一个作用域中,重载解析才能生效。您需要自己将它们带到一个公共作用域:

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);