2010-12-26 29 views
11

Duplicar posible:
Use 'class' or 'typename' for template parameters?¿Cuál es la diferencia entre "plantilla <class T>" y "plantilla <typename T>"?

Veo dos declaraciones de clases diferentes: plantilla

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

y

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

¿Cuál es la diferencia entre estos dos códigos?

EDITAR: Corregí la palabra clave incorrecta "typedef" a "typename".

+5

la diferencia es que la primera es correcta, mientras que la segunda es incorrecta. Use 'typename' en lugar de' typedef' en el segundo, ¡entonces no habrá diferencia! – Nawaz

+4

@Nawaz: Sí, perdón por la palabra clave incorrecta. – hkBattousai

Respuesta

17

Si por

template <typedef T> class SampleClass2 

quiere decir

template <typename T> class SampleClass2 

entonces no hay diferencia. El uso de class y typename (en el contexto de un parámetro de plantilla que se refiere a un tipo) es intercambiable.

La razón por la que ambas palabras clave están permitidas aquí es histórica. Ver this article para una explicación detallada.

14

En el caso de la plantilla plantilla de parámetro de

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

Usted tiene que usar clase antes del nombre de la clase. Esto está mal:

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

pero esto está bien:

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

En otros casos son intercambiables.

+0

Actualización: hay una nueva propuesta en el grupo de estandarización de C++ que elimina esta diferencia. N4051: Permitir typename en un parámetro de plantilla de plantilla-Richard Smith –

Cuestiones relacionadas