2010-12-26 11 views
11

Mögliche Duplizieren:
Use 'class' or 'typename' for template parameters?Was ist der Unterschied zwischen "Vorlage <class T>" und "Vorlage <typename T>"?

Ich sehe zwei verschiedene Template-Klasse Erklärungen:

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

und

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

Was ist der Unterschied zwischen diesen beiden Codes?

EDIT: Ich habe das falsche Schlüsselwort "typedef" auf "typename" korrigiert.

+5

Der Unterschied ist, dass der erste korrekt ist, während der zweite falsch ist. Benutze 'typename' anstelle von' typedef' in der zweiten, dann wird es keinen Unterschied geben! – Nawaz

+4

@Nawaz: Ja, tut mir leid für das falsche Keyword. – hkBattousai

Antwort

17

Wenn von

template <typedef T> class SampleClass2 

meinen Sie

template <typename T> class SampleClass2 

dann gibt es keinen Unterschied. Die Verwendung von class und typename (im Kontext eines Vorlagenparameters, der auf einen Typ verweist) ist austauschbar.

Der Grund, warum beide Schlüsselwörter hier erlaubt sind, ist historisch. Eine detaillierte Erklärung finden Sie unter this article.

14

Bei Vorlage Vorlage Paramater

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

Sie haben Klasse vor Klassennamen zu verwenden. Das ist falsch:

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

aber das ist ok:

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

In anderen Fällen sind sie austauschbar.

+0

Update: Es gibt einen neuen Vorschlag in der C++ - Standardisierungsgruppe, der diesen Unterschied beseitigt. N4051: Erlaube typename in einem Template-Template-Parameter - Richard Smith –

Verwandte Themen