Abgeleitete Template-Klasse
-
Hallo @all,
könnt ihr mir bitte erklären, warum ich in der abgeleiteten Klasse colored_cell keinen Zugriff auf das in der primären Klasse deklarierte info habe? Normalerweise werden doch die als protected deklarierten Variablen an die Kindklasse weitergereicht.
Fehler: info was not declared in this scope
#include <iostream> template <class T> class cell { protected: T info; public: void set(T x) { info = x; } T get() { return info; } }; template <class T> class colored_cell : public cell<T> { protected: char color; public: void set_color(char col) { color=col; } char get_color() { return color; } T get() { if ( color != 'w' ) return info; // HIER TRITT DER FEHLER AUF return 0; } };
-
(Vom Templateparameter) abhängige Basisklassen werden beim unqualifizierten Lookup nicht durchsucht - können nicht durchsucht werden, denn ohne Kenntnis des konkreten Parameters ist es unmöglich, das richtige Template zu ermitteln (bedenke: es könnten noch ggf. später Spezialisierungen hinzukommen). Aus diesem Grunde ist auch es von vornherein nicht erforderlich, ein Template, dessen Spezialisierungen als abhängige Basisklasse dienen, vor dem Template zu definieren, das ableitet (die Definition muss selbstverständlich erfolgt sein, bevor irgendeine konkrete Spezialisierung benutzt wird).
template <class T> class cell; // nur deklariert template <class T> class colored_cell : public cell<T> { protected: char color; public: void set_color(char col) { color=col; } char get_color() { return color; } T get() { if ( color != 'w' ) return info; // HIER TRITT DER FEHLER AUF - das überrascht nun nicht mehr. return 0; } };Abhilfe schafft explizite Qualifikation
return cell<T>::info;oder die ausdrückliche Verwendung von this bzw. eines beliebigen Objektes des Typs (es geht im Kern darum, festzustellen, dass der unbekannte Name ein Klassenmember sein soll).
return this->info;
-
Hallo Camper,
vielen Dank für die ausführliche Erklärung!

Ich werde das mit dem this-Pointer umsetzen.
-
Nur als Zusatz, alternativ zu campers Vorschlägen kann man auch 'using' benutzen:
template <class T> class colored_cell : public cell<T> { protected: using cell<T>::info; …
-
Hallo Konrad,
danke für die Zusatzinfo!
Alle 3 Varianten funktionieren wunderbar.