Template funktionen mit Vererbung Problem (gcc)
-
Hallo
Ich habe ein Problem mit spezialisierten template functionen und Vererbung in gcc-4.0. Der unten gezeigte Code kann mit gcc-3.3 compiliert werden, jedoch nicht mit gcc-4.0. Da die standartkonformität von gcc von Version zu Version immer besser werden soll vermute ich das ich ein prinzipelles C++ Problem hier habe. Bin für Lösungsvorschläge dankbar.
#include "iostream" template<class T> class TTB { private: T* blubb; public: TTB(){} }; template<class T> class TT : public TTB<T> { public: TT(){ blubb = NULL; } }; template<> class TT<unsigned char> : public TTB<unsigned char> { private: unsigned char** blubb; public: TT(){ blubb = NULL; } };Gcc 4.0 Ausgabe:
> gcc-4.0 -c test.cpp test.cpp: In constructor 'TT<T>::TT()': test.cpp:17: error: 'blubb' was not declared in this scopeWenn ich Zeile 17 zu
this->blubb=NULL;ändere kann gcc 4 es kompilieren.
-
blubb ist eine private Membervariable von TTB - die kannst du eigentlich nur innerhalb der Basisklasse erreichen. Also mußt du auch in der Basisklasse den Wert zuweisen.
(möglich, daß du mit der expliziten Spezialisierung den Compiler verwirrt hast)
-
Außerdem müsstest du bei Memberfunktionen/-variablen aus Templates, von welchen du ableitest, explizit angeben woher diese Variablen kommen. Also in deinem Fall auf
blubb = NULL;ein
TTB<T>::blubb = NULL;machen. Aber dann bleibt "blubb" immer noch private und der Compiler sollte wieder einen Fehler bringen.
-
Schon mal vielen Dank für die Antworten bisher.
Leider habe ich mich im ursprünglichen Posting vertan. Alles was ich dort in meinem reduzierten Beispiel als private angegegeben habe sollte eigentlich protected sein. Sorry. Der vollständigkeithaltber hänge ich den korrigierten Code nochmal unten an.
bluecode: Das wird genau mein Problem sein. Hast du eventuell eine Quelle für mich parat wo ich das nochmal ausführlicher anschauen kann. Templates sind noch etwas Neuland für mich.
#include "iostream" template<class T> class TTB { protected: T* blubb; public: TTB(){} }; template<class T> class TT : public TTB<T> { public: TT(){ blubb = NULL; } }; template<> class TT<unsigned char> : public TTB<unsigned char> { protected: unsigned char** blubb; public: TT(){ blubb = NULL; } };
-
Hallo,
statt TTB<T>::blubb kannst du auch einfach this->blubb schreiben. Wichtig ist nur, dass du anzeigst, dass der Name ein "dependent name" ist, also von einem Template-Parameter abhängt.Die beste Quelle zum Thema Templates ist imo "C++ Templates - The complete guide" von David Vandevoorde und Nicolai M. Josuttis.