2010-12-26 23 views
11

Eventuali duplicati:
Use 'class' or 'typename' for template parameters?Qual è la differenza tra "modello <class T>" e "modello <typename T>"?

Vedo due diverse dichiarazioni di classe template:

template <class T> class SampleClass1 
{ 
    // ... 
}; 

e

template <typename T> class SampleClass2 
{ 
    // ... 
}; 

Qual è la differenza tra questi due codici?

MODIFICA: Ho corretto la parola chiave errata "typedef" in "typename".

+5

la differenza è che il primo è corretto, mentre il secondo è errato. Usa 'typename' invece di' typedef' nel secondo, quindi non ci saranno differenze! – Nawaz

+4

@Nawaz: Sì, mi dispiace per la parola chiave sbagliata. Aggiornamento – hkBattousai

risposta

17

Se per

template <typedef T> class SampleClass2 

intendi

template <typename T> class SampleClass2 

quindi non v'è alcuna differenza. L'uso di class e typename (nel contesto di un parametro di modello che fa riferimento a un tipo) è intercambiabile.

La ragione per cui entrambe le parole chiave sono consentite qui è storica. Vedi this article per una spiegazione dettagliata.

14

In caso di template paramater

template <typename T, template <typename> class Wrapper> 
class Foo { 
    //... 
    private: 
    Wrapper<T> data; 
}; 

Devi usare classe prima classname. Questo è sbagliato:

template <typename T, template <typename> typename Wrapper> 

ma questo è ok:

template <typename T, template <class> class Wrapper> 

In altri casi sono intercambiabili.

+0

: c'è una nuova proposta nel gruppo di standardizzazione C++ che elimina questa differenza. N4051: consentire il nome typ in un parametro del modello di modello: Richard Smith –

Problemi correlati