Implementieren einer Nicht-Template-Methode, die in einer Template-Klasse definiert ist

8

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.

    
Oodini 09.12.2011, 13:36
quelle

5 Antworten

9

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.

    
wrren 09.12.2011 13:51
quelle
4

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() { } .)

    
Kerrek SB 09.12.2011 13:39
quelle
4

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.).

%Vor%     
velis 08.05.2015 06:26
quelle
1

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.

    
Let_Me_Be 09.12.2011 13:40
quelle
0

Sie müssen es auf eine andere Weise definieren. Die Methode selbst hängt möglicherweise nicht (direkt) vom Template-Parameter ab, aber die Klasse, zu der sie gehört, tut dies zwar, aber nicht? Daher hängt die Methode indirekt auch vom Template-Parameter ab:

%Vor%     
Xeo 09.12.2011 13:40
quelle

Tags und Links