2011-03-15 12 views
20

¿Cuál es la diferencia entre template <typename T> y template <class T>. Para mí, ambos están generando el mismo resultado.¿Cuál es la diferencia entre la plantilla <typename T> y la plantilla <class T>. Para mí ambos están generando el mismo resultado

por ejemplo

template <class T> 
T Average(T *atArray, int nNumValues) 
{ 
    T tSum = 0; 
    for (int nCount=0; nCount < nNumValues; nCount++) 
     tSum += atArray[nCount]; 

    tSum /= nNumValues; 
    return tSum; 
} 

si la cambio a template <typename T> Es lo mismo

+2

posible duplicado de [C++: ¿Usar 'class' o 'typename' para los parámetros de plantilla?] (Http://stackoverflow.com/questions/213121/c-use-class-or-typename-for-template-parameters) – DarenW

Respuesta

52

No hay ninguna diferencia. typename y class son intercambiables en la declaración de un parámetro de plantilla de tipo.

Usted, sin embargo, tienen que utilizar class (y no typename) cuando se declara un parámetro de plantilla plantilla:

template <template <typename> class T> class C { }; // valid! 
template <template <typename> typename T> class C { }; // invalid! o noez! 
+3

+1 para una mejor respuesta. Eliminé el mío : D – Nawaz

+6

+1 para el uso de la plantilla de la plantilla –

+0

@James: Me picaron, ¿sabe usted si hay alguna razón detrás del uso no válido de 'typename' en esa situación? Pensé que la idea de 'typename' era reservar' class' a la declaración/definición de nuevas clases. –

1

Son equivalentes e intercambiables la mayoría de las veces, y algunos prefieren typename porque el uso de la clase de palabra clave en ese contexto parece confuso.

La razón por la nombretipo se necesita es para aquellos casos ambiguos cuando se utiliza template <class T> por ejemplo, se define una plantilla como esta:

template <class T> 
void MyMethod() { 
    T::iterator * var; 
} 

y luego por alguna razón el usuario de su plantilla decide crear una instancia de la clase como este

class TestObject { 
    static int iterator; //ambiguous 
}; 

MyMethod<TestObject>(); //error 

Se vuelve ambiguo qué var debe ser, una instancia de un iterador de clase o el tipo estático int. Entonces, para este caso, se introdujo typename para forzar que el objeto de la plantilla se interprete como un tipo.

Cuestiones relacionadas