2009-09-12 18 views
20

Poniższy kod szablonu specjalność:C++ szablonu specjalizacji funkcji: "nielegalne stosowanie wyraźnych argumentów szablonu"

template<typename T1, typename T2> 
void spec1() 
{ 

} 

przypadek testowy 1:

template< typename T1> //compile error 
void spec1<int>() 
{ 

} 

przypadek testowy 2:

template< typename T2> //compile error 
void spec1<int>() 
{ 

} 

powoduje następujący błąd kompilacji:

error C2768: 'spec1' : illegal use of explicit template arguments

Czy ktoś wie, dlaczego? Szablony

+0

jakiej platformy/kompilatora używasz? – aaa90210

+0

Używam Visual C++ 08 – jameszhao00

Odpowiedz

51

funkcja nie może być częściowo wyspecjalizowane, tylko w pełni, to znaczy tak:

template<> 
void spec1<char, int>() 
{ 

} 

dlaczego szablony funkcja nie może być częściowo wyspecjalizowane, może chcesz read this.

Kiedy specjalizują się częściowo (możliwe tylko dla klas), trzeba to zrobić tak:

template <typename T1> 
class class1<T1, int> 
{ 

}; 

więc trzeba wymienić T1 ponownie.

Sposób, w jaki napisane są twoje specjalizacje, byłby niejednoznaczny dla spec1<int, int>.

+3

Ah, więc mogę mieć częściowo wyspecjalizowane klasy osadzone z funkcjami statycznymi? – jameszhao00

+0

O, widzę, że artykuł, do którego prowadzi łącze, wyjaśnia już sprawy. Usunąłem odpowiedź, ponieważ przekonałem się, że przekazywanie do klasy jest wygodniejsze w tym przypadku. W przypadkach, w których 'T1' i' T2' są używane jako typy parametrów funkcji, uważam przeciążanie za bardziej czytelne, ponieważ jest to normalne przeciążenie. –

+0

Kiedy przeczytałem "możliwy tylko dla zajęć", odrzuciłem. Zauważyłem, że jest to możliwe zarówno dla klas, jak i struktur ;-). –