Protected member von SuperSuperClass nicht sichtbar für templated Klasse ?
-
Hallo,
ich habe eine kompliziertere Vererbungshierarchie gepaart mit Templates und bin beim compilieren mit g++ erst darauf gestoßen, daß eine Member Variable nicht sichtbar ist.Das "Besondere" daran ist, daß ich eine Verbungshierarchie von 3 Klassen habe, wobei die letzten zwei templated sind.
Hier das Beispiel:
#include <iostream> using namespace std; class Grandpa { public: Grandpa() { mGrandpas = 20; }; virtual ~Grandpa() { }; protected: int mGrandpas; }; template < class T > class Daddy : public Grandpa { public: Daddy() {}; virtual ~Daddy() {}; }; template < class T > class Child : public Daddy < T > { public: Child( ) { }; virtual int A() { cout << mGrandpas << endl; // #1 does not compile !!! -> not declared in this scope cout << Grandpa::mGrandpas << endl; // #2 does not compile !!! object missing in reference to cout << Daddy<T>::mGrandpas << endl; // #3 works! return 20; } }; int main() { Child<int> lC(); cout << lC.A() << endl; }Warum gibt es diese Probleme , d.h. warum gibt es die Fehler in #1 und #2 aber nicth nicht mit #3 ?
Ich habe auch beobachtet, daß wenn ich die Abstraktionsschicht mit Daddy<T> nicht templated mache, der Fehler nicht auftritt.Carstig.
p.s. der Fehler tritt mit g++ (version 3.4.6 unter RedHat Linux als auch mit g++ 3.4.4 unter Win/Cygwin auf) aber nicht mit xlC unter AIX auf.
-
Die unvollständige Template-Basis wird nicht in die Namenssuche mit einbezogen. Schließlich könnte, wenn eine konkrete Instanz von Child erzeugt wird, T so gewählt sein dass Daddy<T> eine Spezialisierung ist, die garkein mGrandpas enthält. Das ist so auch standardkonform.
Um nicht immer den Basisklassennamen angeben zu müssen, kannst Du this->mGrandpas ansprechen.