[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