Problem mit vererbten Template-Klassen



  • Hi,

    habe folgendes Problem:

    template<class T>
    class B: public A {
    protected:
      char *name;
    //...
    };
    
    template<class T, char *chn, int len>
    class C : public B<T> {
    public:
      C( char *nam ): B( nam, chn, len ) {} // line 70
      void set_name( char *nam ) { name = nam; } // line 71
    //...
    };
    

    Der Compiler spuckt eklige Fehlermeldungen aus:

    g++ 4.2.1 schrieb:

    70: error: class ‘C<T, chn, len>’ does not have any field named ‘B’
    71: error: ‘name’ was not declared in this scope

    Scheinbar erkennt er seine eigene Basis nicht wirklich?

    Wenn man in der Zeile mit den !!! das name durch B<T>::name ersetzt, geht es plötzlich.

    Bemerkung:
    Das war ursprünglich ein MSVC-Projekt. Ich wollte es nun für Linux mitm g++ 4.2.1 übersetzen.



  • void set_name( char *nam ) { this->name = nam; } // line 71
    

    dann funktioniert es. MSVC nimmt es da nicht so genau 🙂
    Immer this-> verwenden, wenn man in einer template Klasse auf Member und Methoden der Basis template Klasse zufreift.
    Begründung "C++ Templates - The complete Guide" Abschnitt 9.4



  • Hmm damit ist aber das Konstruktorproblem noch nicht gelöst o_O
    Warum erkennt die Klasse C nicht die Klasse B als Subobjekt an?



  • na, weil du keinen Typ angegeben hast. B ist eine template Klasse:

    C( char *nam ): B< T >( nam, chn, len ) {} // line 70
    

    Ohne den Parameter <T> denkt er du möchtest eine member-Variable ansprechen, daher die Medlung, dass es kein field B in Klasse C gibt



  • Ok, aber ist die this-Methode nicht langsamer, da er hier erst den Pointer dereferenzieren muss? Gibt es keine einfachere Methode?

    Ich müsste jetzt in 100 Zeilen noch this hinzufügen 😞



  • nein, das ist nicht langsamer...
    es gibt sich i.A. nichts, ob du

    this->m_val = 0;
    

    oder

    m_val = 0;
    

    schreibst. Sowas löst der Compiler auf. Bei Template-Klassen, die von Template-Klassen aufgelöst sind ist das mit dem this für den Compiler nicht immer eindeutig, daher MUSS man es dort oft verwenden. Zeit kostet es keine, nur die, die, die du zum Tippen benötigst 😉


Anmelden zum Antworten