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.


Anmelden zum Antworten