2012-04-18 13 views
10

Ist es O.K. virtuelle Funktion der Klassenvorlage außerhalb ihres Körpers zu definieren? Die virtuelle Funktion kann nicht inline ausgeführt werden, aber um Mehrfachdefinitionen in Kompilierungseinheiten zu vermeiden, müssen sie als inline markiert sein (vorausgesetzt, dass Vorlagenköpfe in mehreren Quellendateien enthalten sind). Auf der anderen Seite kann der Compiler inline ignorieren, daher scheint dies gültig zu sein. An einem Beispiel ist der folgende Code korrekt:Vorlagedefinitionen außerhalb des Klassenkörpers

template <typename T> 
class C 
{ 
public: 
    virtual void f(T val); 
}; 

template <typename T> 
inline 
void C<T>::f(T val) 
{ 
    //definition 
} 

?

BTW gcc (3.4.2) ermöglicht inline vor der Definition der Funktion f(T val), aber nicht vor analoge Funktion der regulären Klasse zu unterlassen. Ist es nur das Verhalten von gcc?

+5

Sie verwenden gcc * 3.4.2 *? – jpalecek

+0

@jpalecek in diesem speziellen Beispiel ja. – doc

+1

@doc - Virtuelle Funktionen * können * inline deklariert werden (aber das wird hier nicht benötigt). Der Compiler ist nur ein bisschen schwieriger herauszufinden, wann genau die Funktionen inline sein können. –

Antwort

10

Ja, es ist in Ordnung, auch ohne inline Es funktioniert genauso für gewöhnliche Mitgliederfunktionen und statische Variablen:

// everything in the header: 
template <class T> 
class A 
{ 
    static int i; 
}; 

template <class T> 
int A<T>::i=0; 

Standard-Zitat: (3,2/5)

kann es mor e als eine Definition eines Klassentyps (Abschnitt 9), Aufzählungstyp (7.2), Inline-Funktion mit externe Verknüpfung (7.1.2), Klassenvorlage (Abschnitt 14), nicht statische Funktionsvorlage (14.5.6), statisch Datenelement einer Klassenvorlage (14.5.1.3), Elementfunktion einer Klassenvorlage (14.5.1.1) oder eine Vorlagenspezialisierung für , für die in einem Programm einige Vorlagenparameter nicht angegeben sind (14.7, 14.5.5) dass jede de fi nition in einer Einheit di ff Erent Übersetzung angezeigt wird, und vorausgesetzt, dass die de fi nition folgende Bedingungen erfüllen ...

die Anforderungen im Grunde sagen die beiden Definitionen identisch sein müssen.

Es funktioniert nicht im Falle von regulären Klassen. Es muss im gesamten Programm höchstens eine Definition geben.

+0

Warum hat jemand diese Antwort abgelehnt:? – doc

3

Sie können die Funktionen dort definieren, solange jeder Code, der die fragliche Funktion instanziieren muss, die Sichtbarkeit dieses Codes zum Zeitpunkt der Kompilierung hat (keine Verbindungszeit).

Es ist ziemlich üblich, eine Vorlage in zwei Dateien zu trennen, wobei eine eine traditionelle Kopfzeile ist und die zweite die Implementierung ist, wie bei nicht vorlagenbasierten Funktionen und deren Implementierung. Der einzige Unterschied besteht darin, dass Sie sowohl die Vorlagenimplementierungsdatei als auch die Kopfzeile enthalten müssen, wenn Sie sie verwenden möchten.

4

Sie können Vorlagenmethoden außerhalb der class Definition im selben Header definieren, ohne inline zu verwenden und ohne mehrere Definitionsfehler zu erhalten.

Das liegt daran, dass eine Template-Funktion selbst keine Definition generiert, wenn sie nicht vollständig auf spezialisiert ist. Zu meinen Punkt zu beweisen, die folgenden:

void C<int>::f(int) 
{ 
} 

wird in einem Linkerfehler führen, da die Funktion eine Definition in diesem Fall hat. (Vorausgesetzt, Sie sind diese in mehreren Übersetzungseinheiten Wenn Sie es inline markieren...

inline void C<int>::f(int) 
{ 
} 

der Fehler nicht mehr auftritt

Verwandte Themen