In Template auf Template-Funktion zugreifen
-
Hallo Leute,
es geht hierbei um folgenden Code:
template <class Type> int Wald::BlaetterZaehlen(Type derBaum) { return 2*derBaum.get<int>("Blatt"); }In dieser Template-Funktion dürfen also nur Objekte eingehen, die eine GET-Templatefunktion besitzen. Natürlich wäre es schöner, dies über eine Oberklasse mit virtuellen Deklarationen zu lösen, das ist in der aktuellen Programmstruktur aber nicht so ohne weiteres möglich bzw. begründbar ("historisch gewachsen" nennt man das glaube ich
).Beim Kompilieren (g++) kommt folgender Fehler:
Wald.cpp:17:24: error: expected primary-expression before ‘int’
Wald.cpp:17:24: error: expected ‘;’ before ‘int’
Wald.cpp:17:27: error: expected unqualified-id before ‘>’ token
(Zeile 17 ist "return 2*...")
Kurz: Er erkennt nicht, dass es sich um eine Template-Funktion handelt.Mir wurde gesagt, dass auch die Implementierung eines Templates in der Header-Datei zu erfolgen hat. Aber auch das hat das Problem nicht behoben.
Was mache ich falsch? Jeglicher Hinweis wäre super!
Grüße
Thorolf
-
Du musst schreiben:
return 2*derBaum.template get<int>("Blatt");Grund: der Compiler kann nicht wissen, dass
getein Template ist, also interpretiert er die spitzen Klammern als Vergleiche und nicht als Angabe einer Templateparameterliste. Und ein Vergleich mit einem Typen gibt natürlich einen Fehler. Mit demtemplate-Schlüsselwort sagst du dem Compiler explizit, dassgetein Template ist und<int>die dazugehörige Templateparameterliste.Wenn der Fall öfters vorkommt und dir das ständige
templatezu aufwändig ist, kannst du dir dafür eine freie Funktion schreiben, z.B.template<class T, class Baum> inline int get(Baum b, char* s) { return b.template get<T>(s); } ... return 2*get<int>(derBaum, "Blatt");
-
Es funktioniert! Das habe ich ja vorher noch nie gebraucht.
Vielen Dank für die schnelle und kompetente Hilfe, ipsec.