Entwickler-Ecke
Off Topic - [C++] Deklaration von Template-Funktionen
Jakob_Ullmann - Di 22.06.10 15:52
Titel: [C++] Deklaration von Template-Funktionen
Hi!
Ich arbeite gerade an einem kleinen BASIC-Interpreter als Übungsprogramm in C++. Im Modul varmanag.cc ist folgende Template-Funktion definiert:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| template <class T> T Variables::getVar(char *varname) { for (short i = 0; i <= 255; ++i) if (!strcmp(varname, varnames[i])) return *(reinterpret_cast<T*>(varlink[i])); } |
Wie deklariere ich diese Funktion als Teil der Klasse Variables in der varmanag.h?
Th69 - Mi 23.06.10 15:30
So wie bei der Definition auch:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| class Variables { template <class T> T getVar(char *varname);
// besser ist hier übrigens "const char *" und die Methode als const zu deklarieren, also template <class T> T getVar(const char *varname) const; } |
Beachte nur, daß du die Template-Funktionsdefinition auch im Header schreiben mußt, falls du diese Klasse im Header (z.B. "Variables.h") deklariert hast.
Der übliche Weg dazu ist, eine eigene "Variables.inl" o.ä. einzubinden:
Quelltext
1: 2:
| // unten im Header #include "Variables.inl" |
Dort definierst du dann die Templatefunktion aus deinem Beitrag.
Ganz sauber ist deine Funktion jedoch nicht (wegen dem reinterpret_cast), da kann ja dann jeder Müll rauskommen.
Besser wäre es, du spezialisierst die Funktion für konkrete Datentypen (int, std::string, float, ...).
Jakob_Ullmann - Mi 23.06.10 19:40
Ich dachte immer, man macht die Deklaration in der Header-Datei (.h) und die Definition in der Source-Datei (.cc)? Was soll dann in die Variables.inl?
Th69 - Do 24.06.10 10:23
Templates sind aber nur Vorlagen, d.h. diese müssen jeder Source-Datei beim Einbinden zur Verfügung stehen (und damit man aber trotzdem Deklaration und Definition trennt, benutzt man dafür dann eine weitere Datei (und nennt sie dann z.B. ".inl" ('inline')).
Sieh dir auch mal folgenden FAQ-Beitrag in dem C++ Forum an:
http://www.c-plusplus.de/forum/viewtopic-var-t-is-39467.html
(ursprünglich war das Schlüsselwort "export" dafür vorgesehen, jedoch gibt es nur einen Compiler bisher der das unterstützt - und im neuen Standard C++0x hat man es wieder verworfen, da der Implementierungsaufwand dafür zu groß ist).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!