Standardkonstruktor für templateklasse
-
genau
template<class T> Example<T>::Example()
lässt sich compilieren, wenn man ihn aber aufruft meckert der compiler
"warning C4930: 'Example<T> Example(void)': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)
with
[
T=Person
]
"
-
Hört sich für mich nach dem altbekannten Instanzierungsproblem mit default ctor an.
foo bar(); // deklariert Funktion bar mit Rueckgabewert foo foo bar; // erzeugt Objekt bar mit dem default ctor des Typs foo
-
wenn
foo bar;
richtig wäre, dann muss mein ctor falsch sein. Beim compilieren bekomme ich dann eine Meldung auf einen unaufgelösten externen verweis, sprich mein ctor ist keiner.
Wie sieht der standardctor zu einer templateklasse aus?
-
template<class T> class Example { private: T elem; public: Example(); }; template<class T> Example<T>::Example() { cout<<"Hey, ich bin der Standardctor"<<endl; }
Das packst du in eine Headerdatei, dann müsste es gehen.
Aufgerufen wird's mit:
#include "Example.hpp" Example<double> myExample;
Falls ich bockmist rede, korrigiert mich.
-
ggcc schrieb:
Beim compilieren bekomme ich dann eine Meldung auf einen unaufgelösten externen verweis
Das liegt wahrscheinlich daran, dass du die Definition des ctor in die ÜE (.cpp) gelegt hast. Template Definitionen werden aber erst instanziert, wenn sie verwendet werden. Erst dann ist es möglich Code dafür zu erzeugen, da vorher die Template Parameter ja nicht bekannt sind. Du musst deshalb, wie GPC schon sagte, sämtliche Template Definitionen in eine Header schreiben.
(wobei GPC's Code nicht ganz korrekt ist, da Funktionsdefinitionen im Header ausserhalb der Klasse explizit inline gemacht werden müssen)
-
Also zusammengefasst:
- Bei template Klassen müssen die Methoden alle in der Headerdatei stehen.
- Alle Methoden die in der Headerdatei deklariert und definiert sind müssen IMMER inline sein?So korrekt?
-
zu 1. Nein, nur leider gibts es keinen Compiler der das export-Schlüsselwort
unterstützt, außer dem Comeau (jedenfalls kenn ich sonst keinen) und ohne dem muss
man halt alles in den Header packenzu 2. Der Code ist nur, dann inline wenn du alles in die Klassendeklaration steckst, was bei templates üblich ist.
-
Dann sind templateklassen ja total hässlich (die implementierung davon)
Alles in einer headerdatei und dazu, wenn du sagst es ist so üblich, alles direkt in der klasse :wurgs:
-
ggcc schrieb:
Dann sind templateklassen ja total hässlich
Find ich nicht. Ob es jetzt üblich ist, alles direkt in die Klasse zu packen, weiss ich nicht. Ich mach es jedenfalls ganz gern. Wenn du die gewohnte .h/.cpp Trennung willst, kannst du die Funktionsdefinitionen ja in eine separate Datei (zB .inl) legen und diese dann mit #include in die Headerdatei einbinden.
-
man kann natürlich das was normalerweise in ne cpp kommt in eine cpp schreiben, und ganz am ende in den header mit include einbinden, ist zwar nicht perfekt, aber solangs kein export gibt...
//edit aargh 30secs zu spät^^