[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 15:01:43 CEST 2010
Steven Davidson escribió:
> Hola Gilberto,
Hola Davidson,
> El problema es que el lenguaje y por tanto el compilador supone que, por
> defecto, un identificador se refiere a una entidad que no sea ni un tipo
> ni una plantilla. Por consiguiente, debes indicar que 'method' es una
> plantilla anteponiendo el vocablo 'template' al nombre. Por ejemplo,
> T t = A<T> :: template method<P0>();
> También puedes indicar explícitamente este objeto; esto es,
> 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.
> 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.
> Al parecer, las versiones anteriores de MSVC no siguen el estándar del
> lenguaje en cuanto a las plantillas se refieren.
Ya me he percatado bien de eso.
> Espero haber aclarado las dudas.
Muy bien aclaradas.
> Steven
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:
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.
--
Salu2,
Gilbert
Más información sobre la lista de distribución Cconclase