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

Gilberto Cuba Ricardo gilbert en hlg.rimed.cu
Jue Mayo 27 21:39:50 CEST 2010


Hola Lista,

  Evidentemente podía haber seguido el hilo anterior que había
  empezado con el nombre de este mensaje, pero a mi entender, son dos
  errores distintos o por lo menos esa es la naturaleza que puedo
  determinar hasta el momento.

  Vuelvo a repetir al igual que en el mensaje anterior: "me compila
  bien en Microsoft Visual Studio 2005 y cuando lo compilo en uno de
  GCC: MingW32 y g++ 4.3 de Debian Linux me devuelve varios errores
  en cosas que no entiendo."

  Por favor si alguien tiene alguna idea de esto que me de la luz. A
  continuación los dejo con un ejemplo del programa:

  ----------------------------------------------------
  #include <stdio.h>
  #include <typeinfo>

    template <typename T>
    class A
      {
      public:
        virtual T cc() = 0;
      public:
        template <typename R>
        T method()
          {
            T t = T();
            R r = R();
            printf( "class A\n\ttypename R: %s \n\ttypename T: %s\n", typeid(t).name(), typeid(r).name() );
            return t;
          }
      };

    template <class T, typename P0 = void>
    class C : public A <T>
      {
      public:
        C() {}
      public:
[1]      T cc()
          {
            printf("cc\n");
[2]         T t = method<P0>();
            return t;
          }
      };

  int main()
  {
    C<int, char> *c;
    c = new C<int, char>();
[3] int i = c->cc();
    printf("i value: %d\n", i);

    return 0;
  }
  ----------------------------------------------------

  El error devuelto es:

  In member function 'T C<T, P0>::cc()':|
  error: 'method' was not declared in this scope|
  error: expected primary-expression before '>' token|
  error: expected primary-expression before ')' token|

  Evidentemente el mensaje de error en [2] me da la idea que [1] no
  está viendo a la función "method()" de A, incluso aunque C herede
  de A, que contiene su declaración, que no sé por qué.
  Analizando un poquito me decido a cambiar [2] por:

[2]         T t = A<T>::method<P0>();

  donde tal vez muchos estarían de acuerdo conmigo en el cambio y
  pensaríamos que hemos muerto el error y aquí es donde aparecen
  otros. Incluso, MSVC lo compila bien y GCC 4.3 me devuelve el
  siguiente error:

  In member function 'T C<T, P0>::cc()':|
  error: expected primary-expression before '>' token|
  error: expected primary-expression before ')' token|

  Con este error si me pierdo, porque si hacemos corregimos según
  ella, me da por cambiar [2] por:

[2]         T t = A<T>::method();

  lo cual considero una locura, y es más MSVC, lo reconoce como un
  error (y no es que confíe mucho en él) y entonces ahora cambia el
  error de GCC 4.3 por:

  In member function 'T C<T, P0>::cc() [with T = int, P0 = char]':|
  instantiated from here| [3]
  error: no matching function for call to 'C<int, char>::method()'|

  Por favor, alguien que no se burle de mí como lo ha echo GCC y que
  me pueda ayudar a ver la solución a mi problema.

-- 
Salu2,
 Gilbert





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