tag que name keywords c++ templates keyword

c++ - que - ¿Diferencia de palabras clave ''nombre'' y ''clase'' en las plantillas?



keyword tag que es (5)

  1. Ninguna diferencia
  2. Tipo de plantilla parámetro Container es una plantilla con dos parámetros de tipo.

Para las plantillas he visto ambas declaraciones:

template < typename T > template < class T >

¿Cual es la diferencia?

¿Y qué significan exactamente esas palabras clave en el siguiente ejemplo (tomado del artículo de Wikipedia en alemán sobre plantillas)?

template < template < typename, typename > class Container, typename Type > class Example { Container< Type, std::allocator < Type > > baz; };


Esta pieza de fragmento es de c ++ primer libro. Aunque estoy seguro de que esto está mal.

Cada parámetro de tipo debe ir precedido por la palabra clave class o typename:

// error: must precede U with either typename or class template <typename T, U> T calc(const T&, const U&);

Estas palabras clave tienen el mismo significado y pueden usarse indistintamente dentro de una lista de parámetros de plantilla. Una lista de parámetros de plantilla puede usar ambas palabras clave:

// ok: no distinction between typename and class in a template parameter list template <typename T, class U> calc (const T&, const U&);

Puede parecer más intuitivo usar el nombre de palabra clave en lugar de clase para designar un parámetro de tipo de plantilla. Después de todo, podemos usar tipos incorporados (no de clase) como un argumento de tipo de plantilla. Además, typename indica más claramente que el nombre que sigue es un nombre de tipo. Sin embargo, typename se agregó a C ++ después de que las plantillas ya estaban en uso generalizado; Algunos programadores continúan usando la clase exclusivamente


Para nombrar los parámetros de la plantilla, typename y class son equivalentes. §14.1.2:

No hay diferencia semántica entre la clase y el nombre de tipo en un parámetro de plantilla.

sin embargo, typename es posible en otro contexto al usar plantillas, para sugerir al compilador que se refiere a un tipo dependiente. §14.6.2:

Se supone que un nombre utilizado en una declaración o definición de plantilla y que depende de un parámetro de plantilla no da nombre a un tipo a menos que la búsqueda de nombre aplicable encuentre un nombre de tipo o el nombre se califique con la palabra clave typename.

Ejemplo:

typename some_template<T>::some_type

Sin typename el compilador no puede decir en general si se refiere a un tipo o no.


Si bien no hay ninguna diferencia técnica, he visto que los dos se utilizan para denotar cosas ligeramente diferentes.

Para una plantilla que debe aceptar cualquier tipo como T, incluidas las integradas (como una matriz)

template<typename T> class Foo { ... }

Para una plantilla que solo funcionará donde T es una clase real.

template<class T> class Foo { ... }

Pero tenga en cuenta que esto es puramente una cosa de estilo que algunas personas usan. No es obligatorio por la norma o impuesta por los compiladores


typename y class son intercambiables en el caso básico de especificar una plantilla:

template<class T> class Foo { };

y

template<typename T> class Foo { };

son equivalentes

Dicho esto, hay casos específicos en los que existe una diferencia entre el typename y la class .

La primera es en el caso de los tipos dependientes. typename se utiliza para declarar cuando hace referencia a un tipo anidado que depende de otro parámetro de plantilla, como typedef en este ejemplo:

template<typename param_t> class Foo { typedef typename param_t::baz sub_t; };

El segundo que realmente muestra en su pregunta, aunque no se dé cuenta:

template < template < typename, typename > class Container, typename Type >

Al especificar una plantilla de plantilla , la palabra clave de la class DEBE usarse como se typename anteriormente, no es intercambiable con el typename en este caso (nota: desde C ++ 17, ambas palabras clave están permitidas en este caso) .

También debes usar la class cuando creas una instancia explícita de una plantilla:

template class Foo<int>;

Estoy seguro de que hay otros casos que he pasado por alto, pero la conclusión es que estas dos palabras clave no son equivalentes, y estos son algunos casos comunes en los que necesita usar uno u otro.