2012-04-12 12 views
1

Die Implementierung einer Template-Klasse muss in der Header-Datei enthalten sein, in der sie definiert wurde. Sollte die Implementierung einer solchen Klasse in-class oder regulär erfolgen (wie Sie es mit jeder anderen Klasse tun würden), aber nur in der Header-Datei?C++: Template-Implementierung (Codestil)

Das Problem, das ich mit dem regulären Ansatz habe, ist, dass die Implementierung sehr aufgebläht wird, da Sie die Template-Definition Infront setzen müssen. Ich würde gerne wissen, welcher der gängigste Weg ist.

+0

-Code-Stil Fragen SO nicht weitergehen. – ildjarn

+0

Die Implementierung kann in einer cpp-Datei enthalten sein, wenn Sie alle Typen kennen, für die sie instanziiert wird, und Sie sie in dieser CPP-Datei instanziieren. –

+0

Mögliches Duplikat von http://stackoverflow.com/questions/8662517/do-template-class-member-function-implementations-always-have-to-go-in-the-heade/8662746#8662746 –

Antwort

1

Die wohl häufigste Art und Weise ist die Klassendefinition zu schreiben, dann schreiben Sie die Implementierung in einer anderen Datei, dann #include die Implementierungsdatei am unteren Ende der Header-Datei und listen Sie es nicht in den Dateien kompiliert werden . Auf diese Weise befinden sie sich in verschiedenen Dateien, aber der Compiler ist zufrieden, da die Definition und die Deklaration nach der Vorverarbeitung in derselben Datei sind.

Beispiel:

// header.h 

template<typename T> 
struct A { 
    int dostuff(); 
}; 

#include "header.template" 

// header.template (not header.cpp, to make it clear that this doesn't get compiled) 

template<typename T> 
int A::dostuff() { 
    // do stuff 
} 

Nach der Präprozessor getan wird, sieht die Datei wie

template<typename T> 
struct A { 
    int dostuff(); 
}; 

template<typename T> 
int A::dostuff() { 
    // do stuff 
} 
+0

Ich habe normalerweise gesehen das Suffix '.inl', aber es ist nicht wichtig, solange es nicht' .h' noch '.cpp' ist. –

+0

Boost verwendet '.pp' für dieses Szenario. – ildjarn