Ich habe einige Vorlagen-Code, der ich lieber in einer CPP-Datei gespeichert haben möchte, anstatt inline im Header. Ich weiß, dass dies möglich ist, solange man weiß, welche Vorlagentypen verwendet werden. Zum Beispiel:
.h Datei
class foo
{
public:
template
void do(const T& t);
};
.cpp Datei
template
void foo::do(const T& t)
{
// Etwas mit t machen
}
template void foo::do(const int&);
template void foo::do(const std::string&);
Beachten Sie die letzten beiden Zeilen - die foo::do-Vorlagenfunktion wird nur mit ints und std::strings verwendet, so dass diese Definitionen bedeuten, dass die App verlinkt wird.
Meine Frage ist - ist das ein hässlicher Hack oder wird es mit anderen Compilern/Linkern funktionieren? Ich benutze diesen Code derzeit nur mit VS2008, möchte aber auf andere Umgebungen portieren.
30 Stimmen
Ich hatte keine Ahnung, dass dies möglich war - ein interessanter Trick! Es hätte bei einigen aktuellen Aufgaben erheblich geholfen, dies zu wissen - Prost!
107 Stimmen
Das Ding, das mich verwirrt, ist die Verwendung von
do
als Kennung :p0 Stimmen
Ich habe etwas Ähnliches mit GCC gemacht, aber ich forsche immer noch.
27 Stimmen
Dies ist kein "Hack", sondern eine Vorwärtsdeklaration. Dies hat seinen Platz im Standard der Sprache; daher ist es in jedem standardkonformen Compiler erlaubt.
1 Stimmen
Was ist, wenn Sie Dutzende von Methoden haben? Können Sie einfach
template class foo;template class foo;
am Ende der .cpp-Datei machen?0 Stimmen
Verwandt: stackoverflow.com/questions/495021/…
0 Stimmen
Bitte korrigiere mich, wenn ich falsch liege, @AhmetIpkin. Ich glaube, das nennt man Template-Spezialisierung.
0 Stimmen
Ich mag es wirklich, Vorlageninstanzdefinitionen in der cpp zu speichern, weil es allen mitteilt, welche Implementierungen verwendet werden.