Wenn ich eine Methode definieren will, die in einer Template-Klasse deklariert ist, aber die Methode nicht von den Template-Parametern abhängt, muss ich sie in den Include-Dateien als definieren:
%Vor%oder kann ich es in der cpp-Datei wie folgt definieren:
%Vor%?
Danke.
Sie müssen Ihre Methode wie folgt definieren:
%Vor% Der Grund dafür ist, dass die Methode tatsächlich vom Template-Parameter abhängig ist. Denken Sie daran, dass jede Methode Zugriff auf die spezielle Variable this
hat; während des Methodenaufrufs this
ist tatsächlich ein Parameter, der an die Methode übergeben wird. this
ändert sich abhängig vom Template-Parameter, der bei der Objekt-Instanziierung angegeben wurde. Daher müssen alle Methoden Template-Methoden sein, um alle Formen von this
aufzunehmen.
Fügen Sie es in die Header-Datei ein.
Die Elementfunktion ist immer noch ein Mitglied der Klassenvorlage und Sie müssten schreiben:
%Vor%Wie bei allen Template-Member-Funktionen ist dies noch keine echte Funktion; Nur erzeugt eine echte Funktion, wenn die Klassenvorlage instanziiert wird. Daher müssen die vollständigen Vorlagendefinitionen für jeden sichtbar sein, der die Vorlage instanziiert, und die übliche Vorgehensweise besteht darin, alles in die Kopfzeile einzufügen.
(Beachten Sie, dass Elementfunktionen von Klassenvorlagen selbst als Funktionsvorlagen gelten und Sie sie sogar spezialisieren können: template <> void MyClass<int>::myMethod() { }
.)
Nun, wenn die Methode nicht vom Template-Parameter abhängt, können Sie das nur mit der Vererbung AFAIK tun.
Der Nachteil: mehr Code + Vererbung
Der Vorteil: (viel) weniger Code wird generiert, abhängig davon, welche Teile Ihres Codes tatsächlich Template-abhängig sind. Im folgenden Beispiel erzeugt die Methode NonDependentMethod
nur eine Assembly, während DependentMethod
so viele verschiedene Template-Parameter generiert (nur eins in diesem Fall, aber make MyClass<float>
und Sie haben zwei, usw.).
Sie müssen es so machen:
%Vor%Es ist nicht die Methode, die templated ist, es ist die Klasse.
Sie können eine Template-Methode in einer nicht-templateten Klasse, eine nicht-templatete Methode in einer Template-Klasse (Ihrem Fall) und eine Template-Methode in einer Template-Klasse und natürlich eine nicht-templatete Methode in einer nicht-templateten Methode haben. Template-Klasse.