2015-02-11 9 views
5

Proszę rozważyć następujące źle sformułowane program:Niedokonana definicja funkcji wyspecjalizowanego szablonu klasy wewnętrznej?

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 

Dlaczego nie definicja f skompilować? Jak poprawnie zdefiniować funkcję f w powyższym?

Odpowiedz

8

Błąd dzyń jest bardzo pomocne tutaj:

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

Składnia używasz jest dla szablonu funkcyjnego. Ale f nie jest szablonem funkcji, to tylko funkcja. Aby zdefiniować to, że nie musimy się template kluczowe:

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

W tym momencie S::J<void> jest po prostu inna klasa, więc to nie jest inaczej niż standardowo:

void Class::method() { } 

ci, że tylko potrzebują template jeśli zostały zdefiniowanie funkcji składowej szablonu, na przykład:

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

lub szablonu funkcji członka:

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

"* Potrzebujesz tylko szablonu" jeśli definiujesz funkcję członkowską szablonu * "lub funkcję elementu szablonu. – ildjarn

+0

@ildjarn zaktualizowany – Barry