[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