Sichtbarkeit in abgeleiteten Klassen



  • Hallo.

    Kann mir jemand bitte erklären, wieso das folgende so ist, wie es ist? (Geht nicht, geht)

    template<bool Condition, typename T = void>
    struct EnableIf
    {
    };
    template<typename T>
    struct EnableIf<true, T>
    {
    	typedef T Type;
    };
    
    struct Base
    {
    	static const int Foo = 0;
    };
    
    template<int KeySize>
    struct Derived : public EnableIf<true || KeySize == 42, Base>::Type // Geht nicht
    // struct Derived : public EnableIf<true, Base>::Type // Geht
    {
    	static const int Bar = Foo;
    };
    
    int main()
    {
    	Derived<42> Inst;
    }
    

    (true) und (true || KeySize == 42) sollten doch stets beide in true resultieren und daher das selbe Verhalten aufweisen. Aber sowohl GCC als auch MSVC streiken bei der Version mit der zusätzlichen Gleichheitsprüfung.

    MSVC 2013:

    error C2065: 'Foo': nichtdeklarierter Bezeichner
    

    GCC 4.8.1:

    error: 'Foo' was not declared in this scope
    

    Zunächst dachte ich an einen Compilerbug, dass aber gleich beide Compiler aussteigen liess mich wundern...

    PS.: Alternativen zum gezeigten Code fallen mir schon selbst ein, ich wüsste nur gerne wie das Verhalten zustande kommt.


  • Mod

    Aber sowohl GCC als auch MSVC streiken bei der Version mit der zusätzlichen Gleichheitsprüfung.

    Ja, weil die Basisklasse dann eben von einem Template-Argument abhängig ist. Ob das evaluiert wird ist irrelevant.



  • Arcoth schrieb:

    Aber sowohl GCC als auch MSVC streiken bei der Version mit der zusätzlichen Gleichheitsprüfung.

    Ja, weil die Basisklasse dann eben von einem Template-Argument abhängig ist. Ob das evaluiert wird ist irrelevant.

    Das bedeutet, du musst da explizit ein Base:: vorpacken.



  • Von dieser Regel wusste ich gar nicht, aber sie ergibt natürlich Sinn. Danke euch beiden, die Sache ist geklärt.

    PS.: Interessant ist, dass this-> (das dachte ich mir schon, denn deswegen wurde ich auch noch nie mit der Problematik konfrontiert) oder Derived:: auch den Trick machen.


Anmelden zum Antworten