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 intrue
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.
-
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) oderDerived::
auch den Trick machen.