552 votos

¿Uso ' clase ' o ' typename ' para los parámetros de plantilla?

Posibles Duplicados:
C++ diferencia de palabras clave 'nombre' y 'clase' en las plantillas

Cuando la definición de una función o de la plantilla de la plantilla de clase en C++, se puede escribir esto:

template <class T> ...

o uno puede escribir esto:

template <typename T> ...

Hay una buena razón para preferir uno sobre el otro?


Acepté la más popular (y muy interesante) respuesta, pero la verdadera respuesta parece ser "No, No hay ninguna buena razón para preferir uno sobre el otro."

  • Son equivalentes (excepto como notado abajo).
  • Algunas personas tienen razones para utilizar siempre typename.
  • Algunas personas tienen razones para utilizar siempre class.
  • Algunas personas tienen razones para el uso de ambos.
  • A algunas personas no les importa que uno que utilice.

Nota, sin embargo, en el caso de la plantilla de la plantilla de los parámetros, el uso de class en lugar de typename es requerido. Ver user1428839 la respuesta a continuación. (Pero este caso en particular no es una cuestión de preferencia, es un requisito de la lengua).

376voto

itsmatt Puntos 18905

Stan Lippman habló acerca de esto aquí. Pensé que era interesante.

Resumen: Stroustrup utilizado originalmente class de especificar los tipos de plantillas para evitar la introducción de una nueva palabra clave. Algunos en el comité preocupado de que esta sobrecarga de la palabra clave que llevó a la confusión. Más tarde, el comité introdujo una nueva palabra clave typename para resolver la ambigüedad sintáctica, y decidió dejarlo también se utiliza para especificar los tipos de plantilla para reducir la confusión, pero por compatibilidad con versiones anteriores, class mantuvo su sobrecargado de sentido.

292voto

DarenW Puntos 7817

Según Scott Myers, C++ eficaz (3rd ed.) del artículo 42 (que por supuesto, debe ser la respuesta definitiva) - la diferencia no es "nada".

Consejo es utilizar "clase" si es voluntad T espera siempre ser una clase, con "typename" si puede esperarse otro tipo (int, char * lo que sea). Lo consideran un indicio de uso.

141voto

JorenHeit Puntos 577

Como una adición a todos sobre los postes, el uso de la class palabra clave es obligada cuando se trata con parámetros de plantilla plantilla , por ejemplo:

template <template <typename, typename> class Container, typename Type>
class MyContainer: public Container<Type, std::allocator<Type>
{ /*...*/ };

En este ejemplo, typename Container habría generado un error del compilador, algo como esto:

error: expected 'class' before 'Container'

46voto

Michael Burr Puntos 181287

Yo prefiero usar typename porque no soy un fan de palabras clave sobrecargado (Jesús - cuántos diferentes significados hace static para diversos contextos diferentes?).

9voto

Aaron Puntos 2456

En respuesta a Mike B, yo prefiero usar 'clase' como, dentro de una plantilla, 'nombre' tiene una sobrecarga de sentido, pero 'la clase' no. Tomar esta opción marcada tipo entero, por ejemplo:

template <class IntegerType>
class smart_integer {
public: 
    typedef integer_traits<Integer> traits;
    IntegerType operator+=(IntegerType value){
        typedef typename traits::larger_integer_t larger_t;
        larger_t interm = larger_t(myValue) + larger_t(value); 
        if(interm > traits::max() || interm < traits::min())
            throw overflow();
        myValue = IntegerType(interm);
    }
}

larger_integer_t es dependiente de nombre, por lo que se requiere " typename " para proceder de manera que el analizador puede reconocer que larger_integer_t es un tipo. de clase, en el otherhand, no tiene ningún tipo de sobrecarga significado.

Que... o yo estoy perezoso en el corazón. I tipo de 'clase' mucho más a menudo de lo que 'nombre', y por lo tanto resulta mucho más fácil escribir. O podría ser un signo de que escribo demasiado OO código.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X