Warum findet der Compiler beim Erben von Templates die Member nicht?


  • Mod

    Hallo,

    folgender Code, in dem eine Templateklasse von einer anderen Templateklasse erbt:

    template<typename T> class Base{
    protected:
      int i;
    };
    
    template<typename T> class Richtig: public Base<T>{
    public:
      void test(){++ Base<T>::i;}   // Alles richtig
    };
    
    template<typename T> class Falsch: public Base<T>{
    public:
      void test(){++i;}            // i wird nicht gefunden
    };
    

    Warum werden die Member der Basisklasse nicht wie beim üblichen Vererben gefunden? Wenn die Kindklassen instanziert werden, ist die Basisklasse ja auch komplett gegeben. Und ich dachte, vor der Instanzierung wird gar kein Code für Templateklassen generiert, weil noch nicht bekannt ist, was als Templateparameter genommen werden soll.




  • Mod

    edit: Ok, hat also nichts mit Compiler zu tun.
    edit2: Beziehungsweise hat es doch, jetzt wo ich den verlinkten Text etwas weiter gelesen habe. Also gcc kann's nicht.



  • SeppJ schrieb:

    edit2: Beziehungsweise hat es doch, jetzt wo ich den verlinkten Text etwas weiter gelesen habe. Also gcc kann's nicht.

    "gcc kann's nicht" klingt so, als wäre es eine Schwäche. Es ist aber genau anders herum. Der GCC führt ein 2-Phasen-Lookup durch, wie es vom Standard verlangt wird und kann -- gerade weil er dies (absichtlich) macht -- Dir eine Fehlermeldung rausgeben. Das ist eine gute Sache, mit dem 2-Phasen-Lookup. Schreibe einfach

    ++this->i;
    

    und alles ist i.O. Wenn Du "i" mit "this->" qualifizierst, dann wird die Namensauflösung von "i" bis zur zweiten Phase verzögert, weil die Basisklasse von einem Template-Parameter abhängt.

    1. Phase = Parsen und Analyse des Templates
    2. Phase = Instanziieren eines Templates

    Gruß,
    SP


  • Mod

    Sebastian Pizer schrieb:

    "gcc kann's nicht" klingt so, als wäre es eine Schwäche.

    War so aber eigentlich gar nicht gemeint.


Anmelden zum Antworten