[C con Clase] Un error con plantillas en GCC y no en Visual Studio (Parte II)
Gilberto Cuba Ricardo
gilbert en hlg.rimed.cu
Mie Jun 2 20:16:20 CEST 2010
Steven Davidson escribió:
> Hola Gilberto,
Hola Davidson,
>> La verdad es que este tipo de cosas es la primera vez que las veo. Le
>> he dedicado un tiempecito a revisar el estándar de C++ y lo encontré
>> después de tanto revisar, pero casi apenas unos dos o tres ejemplos.
> Sí. Hay muy poco acerca de esta situación. Por eso me tuve que remitir a
> la gramática del lenguaje para entender la sintaxis correctamente.
Cuando usted dice la grámatica, está recurriendo a su memoria o a
algún documento en especial sobre la gramática. En especial yo me
estaba remitiendo a http://www2.research.att.com/~bs/SC22-N-4411.pdf
el cual es un borrador del próximo C++0x.
> Quería hacer hincapié en que se trata de una plantilla y el lenguaje la
> ve como tal. Posteriormente, se trata de una plantilla de una función o
> de una clase. Pero en principio es una plantilla. Esto es comparable con
> un puntero. Se trata de un puntero, al principio, irrelevantemente de si
> el puntero es a 'int' o a 'char'.
> En el momento de usar la plantilla, entonces obtenemos una función o una
> clase, ya que el compilador debe generarlas. Sin embargo, como usamos la
> función-plantilla en base a un parámetro de plantilla, P0, entonces
> sigue siendo una incógnita, porque no se puede generar hasta que 'PO' no
> sea asociado a un tipo de dato. Por ello, hay que indicar explícitamente
> que se trata de una plantilla escribiendo 'template'.
Me queda claro ya.
> Ciertamente, no presentamos un ejemplo en el que definimos externamente
> las funciones miembro de una plantilla dentro de otra plantilla. Sí,
> tenemos un ejemplo que las define internamente. El ejemplo trata de una
> pila y está en:
> http://c.conclase.net/curso/index.php?cap=040d#042_ejemplo2
Sí, este lo había visto, es muy común verlo hoy día, y es apropiado
para ver la definición de una estructura o clase con plantillas dentro
de otra.
>> template <class T> template <class ST>
>> X<T>::stt<ST> X<T>::method()
>> {
>> stt<ST> myvar;
>> myvar.st = "un texto";
>> return myvar;
>> }
Yo más bien hacía referencia a esta parte, en la que hay que tener
en cuenta que deben hacerse referencia a las dos plantillas, una a
continuación de la otra (aunque no sé si podrá existir otra forma), y
acontinuación la definición de la función miembro con los parámetros
de las plantillas.
> Todo es correcto, pero no recomiendo usar 'printf()', sino 'cout <<'.
> Entiendo que se trata de un ejemplo, pero tampoco recomiendo usar 'const
> char *', por la forma un tanto peligrosa de tratar las cadenas de
> caracteres.
Claro.
> Bueno, espero que vayamos aclarando el tema.
Seguro, aunque es un tanto tedioso toda esta parte de las plantillas
en C++.
> Steven
--
Salu2,
Gilbert
Más información sobre la lista de distribución Cconclase