2015-02-11 4 views
5

Bitte beachten Sie das folgende schlecht gebildet Programm:Out-of-class Definition der Funktion der spezialisierten inneren Klassenvorlage?

struct S { 
    template<class T> struct J { }; 
}; 

template<> 
struct S::J<void> { 
    void f(); 
}; 

template<> 
void S::J<void>::f() {} // ERROR 

$ clang++ -std=c++11 test.cpp 
no function template matches function template specialization 'f' 

$ g++ -std=c++11 test.cpp 
template-id ‘f<>’ for ‘void S::J<void>::f()’ does not match any template declaration 

Warum nicht die Definition von f kompilieren? Wie definiere ich die Funktion f richtig in obigem?

Antwort

8

Das Klirren Fehler ist sehr hilfreich, hier:

no function template matches function template specialization 'f' 
// ^^^^^^^^^^^^^^^^^ 

Die Syntax, die Sie verwenden sich für eine Funktionsschablone ist. Aber f ist keine Funktionsvorlage, es ist nur eine Funktion. Um sie zu definieren, brauchen wir nicht das template Stichwort:

void S::J<void>::f() {} 

An diesem Punkt S::J<void> nur eine andere Klasse ist, so ist dies nicht anders als Ihre Standard:

void Class::method() { } 

, würden Sie nur müssen template, wenn Sie eine Elementfunktion einer Vorlage wurden definiert, zum Beispiel:

template <typename T> 
void S::J<T>::g() { } 

oder ein Mitglied Funktionsvorlage:

template <typename T> 
void S::J<void>::h<T>() { } 
+0

"* Sie würden nur' template' benötigen, wenn Sie eine Elementfunktion einer Vorlage definieren * "Oder eine Template-Member-Funktion. – ildjarn

+0

@ildjarn aktualisiert – Barry

Verwandte Themen