[C con Clase] Un error con plantillas en GCC y no en Visual Studio (Parte II)

Steven Davidson srd4121 en njit.edu
Mie Jun 2 18:55:30 CEST 2010


Hola Gilberto,

Gilberto Cuba Ricardo wrote:
>> T t = this -> template method<P0>();
> 
> 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.

>> Ten presente que 'method' no es una función, sino una plantilla (de
>> función). Asimismo, ni 'A' ni 'C' son clases, sino plantillas (de
>> clase).
> 
> Bueno, esto de la plantilla de función no sé muy bien a que se
> refiere usted, porque lo veo con mucho énfasis en su texto; pero lo
> que yo he entendido siempre es que no es función en tanto no se ha
> especificado un valor al parámetro de la plantilla, rectifíqueme si
> me equivoco.
> 

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'.

> PD: Un poco fuera del asunto del email, he estado buscando en el 
> sitio propio de Cconclase, en la parte del curso de C/C++, lo 
> referente a la definición externa (fuera de la declaración de la 
> clase) de un método de esta que utiliza varias plantillas, y no he 
> encontrado nada (la búsqueda fue superficial). Mi recomendación es
> que tal vez se pueda incluir algo referente a esto en el curso, claro
> si se considera oportuno. Por ejemplo, que tal vez no sea el más
> indicado:
> 

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

> 
>     template <class T>
>     class X
>       {
>       public:
>         template <class ST>
>         struct stt
>           {
>             ST st;
>           };
> 
>         template <class ST>
>         stt<ST> method();
>       };
> 
>     template <class T> template <class ST>
>     X<T>::stt<ST> X<T>::method()
>       {
>           stt<ST> myvar;
>           myvar.st = "un texto";
>           return myvar;
>       }
> 
>   ---main---
>   ...
>   X<int> *p;
>   printf("%s\n", p->method<const char*>().st );
>   ...
>   ---main---
> 
> Yo realmente pasé un poco de trabajo para poder implementarlo, pero al
> fin pude resolverlo. Cualquier comentario al respecto será bien
> agradecido.
> 
> 

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.


Bueno, espero que vayamos aclarando el tema.

Steven




Más información sobre la lista de distribución Cconclase