Autor Beitrag
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 22.06.10 15:52 
Hi!

Ich arbeite gerade an einem kleinen BASIC-Interpreter als Übungsprogramm in C++. Im Modul varmanag.cc ist folgende Template-Funktion definiert:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4808
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 23.06.10 15:30 
So wie bei der Definition auch:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4808
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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: www.c-plusplus.de/fo...-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).