2013-02-08 25 views
11

Potrzebuję specjalizować szablon funkcji w języku C++.Specjalizacja szablonów dla funkcji bez parametrów

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

Aby

template<> 
void doStuff<DefinedClass>(); 

i

template<> 
void doStuff<DefinedClass2>(); 

myślę, że nie jest poprawna składnia (ponieważ nie jest kompilacji). Jak mam to zrobić?
Ponadto, ponieważ nie będę miał niezdefiniowanych parametrów szablonu w doStuff<DefinedClass>, czy możliwe byłoby zadeklarowanie treści w pliku .cpp?

Uwaga: DoStuff użyje T w swoim ciele do zadeklarowania zmiennej.

+1

Kiedy mówisz „nie jest kompilacji”, powinien zawierać odpowiedni komunikat o błędzie. –

+0

Czy "szablon void doStuff () {}' nawet kompilacji na pierwszym miejscu (myślę, że '' jest nieprawidłowy). –

Odpowiedz

12

Główny szablon nie otrzymuje drugiej pary argumentów szablonu. Tylko w tym:

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

Tylko specjalizacje mają zarówno template <> z przodu i <...> po nazwie, np:

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

Dzięki, ale nadal nie działa. Jeśli napiszę specjalizację taką jak: "szablon <> void doStuff();" Mam "niepoprawną specjalizację jawną przed"> "tokenem" –

+0

Jeśli wstawię "szablon " otrzymam "szablon-id" buildBom "w deklaracji głównego szablonu" –

+2

Nie, powinien to być 'template <> void doStuff (); 'dla specjalizacji i' szablon void doStuff(); 'dla ogólnego przypadku ... – Synxis

4

Poprawna składnia dla podstawowego szablonu jest:

template <typename T> 
void doStuff() {} 

Aby zdefiniować specjalizację, wykonaj następujące czynności:

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

Myślę, że to nie jest poprawna składnia (ponieważ nie kompiluje). Jak mam to zrobić? doStuff użyje T w swoim ciele, aby zadeklarować zmienną.

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

} 

możliwe byłoby zadeklarować ciało w .cpp?

C++ obsługuje tylko , nie można kompilować osobno, a następnie dodawać łącza.

Od komentarza, jeśli chce się specjalizować w int typu:

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