Gibt es einen Unterschied zwischen der Definition von Member-Funktionen für eine Template-Klasse innerhalb der Klassen-Deklaration gegenüber der externen?
Definiert im Inneren:
%Vor%Außerhalb definiert:
%Vor%Bei Nicht-Template-Klassen ist dies der Unterschied zwischen Inline- und Nicht-Inlined-Methoden. Gilt das auch für Vorlagenklassen?
Der Standard für die meisten meiner Kollegen ist das Bereitstellen von Definitionen innerhalb der Klasse, aber ich habe immer Definitionen außerhalb der Klasse bevorzugt. Ist meine Präferenz gerechtfertigt?
Bearbeiten: Bitte gehen Sie davon aus, dass der obige Code in der Header-Datei für die Klasse enthalten ist.
Ja, genau das gleiche gilt für Vorlagenklassen.
Der Grund, warum Methodendefinitionen für Schablonenklassen normalerweise inline sind, ist, dass bei Vorlagen die gesamte Definition sichtbar sein muss, wenn die Schablone instanziiert wird.
Wenn Sie also die Funktionsdefinition in eine separate CPP-Datei einfügen, erhalten Sie einen Linker-Fehler.
Die einzige allgemeine Lösung besteht darin, die Funktion inline zu machen, indem Sie sie innerhalb der Klasse oder außerhalb mit dem Schlüsselwort inline
definieren. aber in beiden Fällen muss es überall sichtbar sein, wo die Funktion aufgerufen wird, was bedeutet, dass es sich normalerweise im selben Header befindet wie die Klassendefinition.
Es gibt keinen Unterschied, abgesehen davon, dass Sie mehr tippen müssen. Das beinhaltet das template
-Bit, das inline
und das Verwenden von "ausgefeilteren" Namen, wenn auf die Klasse Bezug genommen wird. Zum Beispiel
Beachten Sie, dass Sie bei der Definition der Methode die Template-Parameterliste <T>
immer weglassen können, wenn Sie sich auf A<T>
beziehen und einfach A
verwenden. Wenn Sie es außerhalb definieren, müssen Sie den Namen "full" im Rückgabetyp und im Namen der Methode (aber nicht in der Parameterliste) verwenden.
Ich weiß das..Ich denke es muss etwas sein, was dir hilft?
%Vor%Es ist nicht in Ordnung, die Definition einer Memberfunktion einer Template-Klasse wie folgt anzugeben:
%Vor%// ...
%Vor%Das ist aus ein paar Gründen falsch. So ist das:
%Vor%Die richtige Definition benötigt das Template-Schlüsselwort und die gleichen Template-Argumente, für die die Definition der Klassenvorlage deklariert wurde. Das gibt also:
%Vor%Beachten Sie, dass es andere Arten von Schablonendirektiven gibt, z. B. Mitgliedervorlagen usw., die jeweils ihre eigene Form annehmen. Was wichtig ist, ist zu wissen, was Sie haben, damit Sie wissen, wie man jeden Geschmack schreibt. Dies ist insbesondere der Fall, da die Fehlermeldungen einiger Compiler möglicherweise nicht klar sind, was falsch ist. Und nimm natürlich ein gutes und aktuelles Buch.
Wenn Sie eine verschachtelte Elementvorlage in einer Vorlage haben:
%Vor%Wie definierst du abc außerhalb von xyz? Dies funktioniert nicht:
%Vor%noch nicht:
%Vor%Sie müssten das tun:
%Vor% Beachten Sie, dass es ...abc
nicht ...abc<U>
ist, da abc eine "primäre" Vorlage ist. IOWs, das ist nicht gut:
// hier nicht erlaubt: Vorlagenschablonenstruktur xyz :: abc {};