2015-09-03 7 views
1

Я действительно борется с проблемой наследования при использовании того, что должно быть строго типизированным перечислением - однако перечисления, кажется, являются неоднозначными при использовании через наследование.enum class неоднозначное наследование

Im используя г ++ (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

Функции должны быть в той же области, в которой разрешено работать с перегрузкой. Вы должны были бы привести их к общим рамкам сам:

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

DEMO

или явно указать область:

inherited_obj.A::set(AE::V1); 
inherited_obj.B::set(BE::V2); 
inherited_obj.C::set(CE::V3); 
+0

ARGH, то есть Hillarious - я думал, что я мог бы сделать это более умный путем шаблонирования классов функций, чтобы я мог устранить много кода, поскольку они по существу выполняли те же функции только на своих собственных наборах данных. – Tobibobi

+0

Однако это действительно сработало, спасибо! – Tobibobi