2013-07-08 10 views
6

Jaka byłaby różnica między najbliższych dwóch deklaracji:Różnica między szablonem z dwoma parametrami i dwie deklaracje szablonów z jednym parametrem każdego

template<class T, class functor> 
methodReturnType className::methodName(functor f) 

oraz:

template<class T> 
template<class functor> 
methodReturnType className::methodName(functor f) 

Próbowałam napisz metodę, która działałaby z argem funktora. Druga deklaracja pozwoliła mi uniknąć zadeklarowania całej klasy jako szablonu zarówno dla operatora Tifunktora. Chciałem mieć szablon o klasie className tylko jednego parametru T, ale wewnątrz tej klasy metoda miała inny parametr functor, natomiast nie deklarowała całej klasy jako szablonu dwóch parametrów. Zadziałało, ale nie do końca to zrozumiałem.

Odpowiedz

3

Drugi wariant jest odpowiedni dla Twojego przypadku według reguł językowych.

n3376 14.5.2/1

Człon wzór matrycy klasy, który jest określony na zewnątrz od jego definicji klasy matrycy będzie określony w Szablon-parametry klasy matrycy następnie przez szablon-parametry szablonu członkowskiego.

[przykład:

template<class T> struct string { 
template<class T2> int compare(const T2&); 
template<class T2> string(const string<T2>& s) { /∗ ... ∗/ } 
}; 
template<class T> template<class T2> int string<T>::compare(const T2& s) { 
} 

- przykład end]

+0

Dziękuję. Zrozumiany. –

3

Pierwszy to (bez matrycy), funkcja członkiem klasy matrycy template< typename T, typename functor > class className. Drugi jest szablonem funkcji członek klasy szablonu template <typename T> class className, np

pierwsze:

template <typename T, class Functor > 
class ClassName 
{ 
ReturnType functionName(Functor f); 
}; 

drugie:

template <typename T> 
class ClassName 
{ 
template <typename Functor> 
ReturnType functionName(Functor f); 
}; 

Mówisz, że nie dokładnie rozumiem, ale ty Wydaje się, że zrozumieli najważniejsze: w drugim przypadku szablon klasy ma tylko jeden parametr, ale nawet po utworzeniu (definicja typu T), funkcja elementu pozostaje szablonem, który można utworzyć na wiele różnych typów. A ponieważ jest to szablon funkcji, zastosowanie ma szablon Argument , więc nie trzeba określać typu; kompilator wykryje to samo, gdy zadzwonisz do funkcji .

Powiązane problemy