2010-02-25 8 views
19

estoy tomando una clase de C++, y mi profesor menciona de pasada que existía la palabra clave typename en C++ (en lugar de utilizar la palabra clave class en una declaración de plantilla), para compatibilidad con versiones anteriores con "Plantillas C"la que expresa nombretipo existe en C++, para la compatibilidad hacia atrás con “plantillas C?”

Esto me dejó sin palabras. Tengo nunca visto o escuchado hablar de nada como las plantillas de C++ (excepto, tal vez, el preprocesador ... y eso no es realmente lo mismo en absoluto) en ANSI C. Así que, me perdí algo enorme en algún lugar, o es esta es una extensión realmente esotérica por gcc o algo así, ¿o está mi maestro fuera de la base?

+25

¿Puedes obtener un nuevo maestro? – SLaks

+0

Para ser sincero, realmente me gusta este profesor. Él es, de lejos, el mejor maestro de 'programación' que he conocido en esta universidad. Evitaré especificar qué universidad (y qué profesores), por su bien. – ELLIOTTCABLE

+1

(Para dar una comparación, uno de los profesores anteriores, enseñando un curso C, nos instruyó a "comenzar cada archivo con la línea' void main() {'. Hay tantas cosas mal con eso, ni siquiera sé por dónde empezar ... el ser más evidente, para mí, dando 'main()' a 'void' return type. Eso es tan poco UNIX) -: ELLIOTTCABLE

Respuesta

0

Esto no parece correcto. typename no es una palabra reservada en C.

Quizás se equivocaron/recordaron y pensaban en "C with Classes".

2

No, no existe una plantilla en C. typename ni siquiera es una palabra clave en C.

3

Su maestro está inventando cosas. No hay tal cosa como plantillas en C. Existe la palabra clave typename por dos razones:

  1. tiene más sentido decir que template<typename T>template<class T> desde T puede haber tipos que no son de la clase como int o double.

  2. Se puede usar para resolver ambigüedades de análisis en declaraciones como A::B * foo;. ¿Esto declara una variable llamada foo, o es una expresión de multiplicación? (Respuesta:. Se analiza como éste Para que sea una declaración escribir typename A::B *foo; que le dice al compilador para interpretar A::B como un nombre del tipo, no un nombre de variable.)

Ver http://pages.cs.wisc.edu/~driscoll/typename.html para una explicación detallada.

5

Tal vez la frase que su maestro era apuntaba a lo largo de las líneas de "... para la compatibilidad hacia atrás con C tipos", es decir, el reconocimiento del problema que template<class T> es engañoso cuando T se construye un estilo de C -en tipo como char o int, como han dicho otros. ¡Pero eso no es una clase! :-)

Un tiempo atrás a algunas personas del CCG eran suggesting que la toma de la maquinaria plantilla disponible para el compilador de C sería una buena manera de poner en práctica C99 de <tgmath.h>, pero que no parecen haber llegado a nada.

0

quiero decir que el C realmente no tienen una plantilla de material nativo, sin embargo, puede hacer que funciona bien con una especie de MetaProgramming, take a look alrededor de la web encontrará cómo ...

Otra cosa importante que decir es que C es un lenguaje de programación de propósito general, por lo que muchas cosas como orientación de objetos, plantillas y otras cosas se pueden hacer con un poco más de esfuerzo.

Los proyectos como Gnome son una prueba de que se puede hacer y muy bien.

P.S .: ¡¡¡Lo siento por mi terrible inglés !!!

Cuestiones relacionadas