2013-02-08 2 views
11

Ich muss eine Funktionsvorlage in C++ spezialisieren.Template-Spezialisierung für eine Funktion ohne Parameter

template<typename T> 
void doStuff<T>() {} 

Um

template<> 
void doStuff<DefinedClass>(); 

und

template<> 
void doStuff<DefinedClass2>(); 

Ich denke, das ist nicht die richtige Syntax (da es nicht kompiliert wird). Wie soll ich das machen?
Auch, da ich nicht undefined Template-Parameter in doStuff<DefinedClass> haben, wäre es möglich, den Körper in einer .cpp deklarieren?

Hinweis: DoStuff verwendet T in seinem Körper, um eine Variable zu deklarieren.

+1

Wenn Sie sagen, „es ist nicht kompiliert“, sollten Sie die entsprechende Fehlermeldung enthalten. –

+0

Tut 'Vorlage void doStuff () {}' sogar kompilieren an erster Stelle (ich denke, dass '' ist ungültig). –

Antwort

12

Die primäre Vorlage erhält kein zweites Paar von Vorlagenargumenten. dies ist nur:

template <typename T> void doStuff() {} 
//      ^^^^^^^^^ 

Nur die Spezialisierungen sowohl eine template <> an der Vorderseite und eine <...> nach dem Namen, zB:

template <> void doStuff<int>() { } 
+0

Danke, funktioniert aber immer noch nicht. Wenn ich die Spezialisierung schreibe wie: "Vorlage <> void doStuff();" Ich habe: "ungültige explizite Spezialisierung vor '>' Token" –

+0

Wenn ich "Vorlage " setze bekomme ich "Template-ID' buildBom 'in Deklaration der primären Vorlage " –

+2

Nein, es sollte' Vorlage <> void doStuff sein(); 'für Spezialisierung und' Vorlage void doStuff(); 'für den allgemeinen Fall ... – Synxis

4

Die korrekte Syntax für die primäre Vorlage:

template <typename T> 
void doStuff() {} 

Um eine Spezialisierung zu definieren, tun Sie dies:

template <> 
void doStuff<DefinedClass>() { /* function body here */ } 
2

Ich denke, das ist nicht die richtige Syntax (da es nicht kompiliert). Wie soll ich das machen? DoStuff verwendet T in seinem Körper, um eine Variable zu deklarieren.

template<typename T> 
void doStuff() 
{ 
    T t = T(); // declare a T type variable 

} 

wäre es möglich, den Körper in einer CPP zu erklären?

C++ unterstützt nur inclusive mode nur, Sie können nicht separat kompilieren dann später verknüpfen.

Von Kommentar, wenn Sie für int Typ spezialisieren wollen:

template<> 
void doStuff<int>() 
{ 
}