2013-07-08 8 views
6

Quale sarebbe la differenza tra i prossimi due dichiarazioni:Differenza tra un modello con due parametri e due dichiarazioni di modelli con un parametro ogni

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

e:

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

stavo cercando di scrivere un metodo che funzioni con un functor arg. La seconda dichiarazione mi ha permesso di evitare di dichiarare l'intera classe come un modello di entrambi T e . Volevo avere una classe modello className di un solo parametro T, ma all'interno di quella classe, un metodo aveva un altro parametro functor, mentre non dichiarava l'intera classe come un modello di due parametri. Ha funzionato, ma non l'ho capito bene.

risposta

3

La seconda variante è adatta al tuo caso in base alle regole della lingua.

n3376 14.5.2/1

Un membro template di un modello di classe definita al di fuori della sua definizione template di classe è specificata con i template-parametri del modello di classe seguite dalla parametri modello del modello membro.

[Esempio:

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) { 
} 

- esempio fine]

+0

Grazie. Inteso. –

3

Il primo è un (non-template) funzione membro della classe template template< typename T, typename functor > class className. Il secondo è un modello di funzione di membro del modello di classe template <typename T> class className, ad esempio:

Primo:

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

Secondo:

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

Tu dici che non hai capito a fondo, ma si sembra che abbia colto l'essenziale: nel secondo caso, il modello di classe ha un solo parametro, ma anche dopo l'istanziazione (definizione di tipo T), la funzione membro rimane un modello, che può essere istanziato su molti tipi diversi. E poiché si tratta di un modello di funzione, si applica la deduzione argomento modello , quindi non è necessario specificare il tipo; il compilatore lo capirà da solo quando si chiama la funzione .

Problemi correlati