2010-12-26 49 views
11

Powiel możliwe:
Use 'class' or 'typename' for template parameters?Jaka jest różnica między "szablonem <class T>" i "szablonem <typename T>"?

widzę dwa różne deklaracje klasy Szablon:

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

i

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

Jaka jest różnica między tymi dwoma kodami?

EDYCJA: Poprawiłem niewłaściwe słowo kluczowe "typedef" na "typename".

+5

Różnica polega na tym, że pierwsza jest prawidłowa, a druga błędna. Użyj "typename" zamiast "typedef" w drugim, wtedy nie będzie różnicy! – Nawaz

+4

@Nawaz: Tak, przepraszam za złe słowo kluczowe. Aktualizacja – hkBattousai

Odpowiedz

17

Jeśli przez

template <typedef T> class SampleClass2 

znaczy

template <typename T> class SampleClass2 

wtedy nie ma żadnej różnicy. Zastosowanie class i typename (w kontekście parametru szablonu, który odnosi się do typu) jest wymienne.

Powód, dla którego oba słowa kluczowe są tutaj dozwolone, jest historyczny. Szczegółowe objaśnienie można znaleźć w sekcji this article.

14

W przypadku szablonu szablon paramater

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

Musisz użyć klasę przed classname. Tak jest źle:

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

ale to jest ok:

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

W pozostałych przypadkach są one wymienne.

+0

: w grupie standaryzacyjnej C++ jest nowa propozycja, która eliminuje tę różnicę. N4051: Zezwalaj na typename w parametrze szablonu szablonu - Richard Smith –

Powiązane problemy