• Viernes 8 de Noviembre de 2024, 20:53

Autor Tema:  Un error con plantillas en GCC y no en Visual Studio  (Leído 1386 veces)

gilberto.cuba

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Un error con plantillas en GCC y no en Visual Studio
« en: Viernes 28 de Mayo de 2010, 17:28 »
0
Hola colegas,

  Tengo un problema con un programa que 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:

Código: C++
  1.  
  2.   #include <stdio.h>
  3.   #include <typeinfo>
  4.  
  5.     template <typename T>
  6.     class A
  7.       {
  8.       public:
  9.         virtual T cc() = 0;
  10.       public:
  11.         template <typename R>
  12.         T method()
  13.           {
  14.             T t = T();
  15.             R r = R();
  16.             printf( "class Anttypename R: %s nttypename T: %sn", typeid(t).name(), typeid(r).name() );
  17.             return t;
  18.           }
  19.       };
  20.  
  21.     template <class T, typename P0 = void>
  22.     class C : public A <T>
  23.       {
  24.       public:
  25.         C() {}
  26.       public:
  27. [1]      T cc()
  28.           {
  29.             printf("ccn");
  30. [2]         T t = method<P0>();
  31.             return t;
  32.           }
  33.       };
  34.  
  35.   int main()
  36.   {
  37.     C<int, char> *c;
  38.     c = new C<int, char>();
  39. [3] int i = c->cc();
  40.     printf("i value: %dn", i);
  41.  
  42.     return 0;
  43.   }
  44.  
  45.  

  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.

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Un error con plantillas en GCC y no en Visual Studio
« Respuesta #1 en: Viernes 28 de Mayo de 2010, 20:55 »
0
Buenas.

Lo probe y me da el mismo error, el que la verdad no se por que se produce, por mi poca experiencia diria que el codigo es correcto.

Aca te dejo una forma de hacerlo.
No se si es exactamente lo que buscabas, pero deberia dar el mismo resultado que buscas, y deberia compilar en cualquier compilador (yo solo lo probe con g++)

Saludos

Código: C++
  1.  
  2. #include <stdio.h>
  3. #include <typeinfo>
  4.  
  5.  
  6. template <typename T, typename R>
  7. class A
  8. {
  9. public:
  10.     virtual T cc() = 0;
  11.     A(){}
  12.     ~A(){}
  13. public:
  14.    
  15.     T method()
  16.     {
  17.     T t = T();
  18.     R r = R();
  19.     printf( "class Anttypename R: %s nttypename T: %sn", typeid(t).name(), typeid(r).name() );
  20.     return t;
  21.     }
  22.  
  23. };
  24.  
  25.  
  26. template <typename T, typename P = void>
  27. class C : public A<T,P>
  28. {
  29. public:
  30.     C() {}
  31.     ~C(){}
  32. public:
  33.  
  34.     T cc()
  35.     {
  36.         printf("ccn");
  37.         T t = this->method();
  38.         return t;
  39.     }
  40. };
  41.  
  42.  
  43. int main()
  44. {
  45.     C<int, char> *c;
  46.     c = new C<int, char>();
  47.     int i = c->cc();
  48.     printf("i value: %dn", i);
  49.  
  50.     return 0;
  51. }
  52.  
  53.  
The sweet smell of a great sorrow lies over the land.


gilberto.cuba

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Un error con plantillas en GCC y no en Visual Studio
« Respuesta #2 en: Lunes 31 de Mayo de 2010, 15:16 »
0
Cita de: "Epa"
Buenas.

Lo probe y me da el mismo error, el que la verdad no se por que se produce, por mi poca experiencia diria que el codigo es correcto.

Aca te dejo una forma de hacerlo.
No se si es exactamente lo que buscabas, pero deberia dar el mismo resultado que buscas, y deberia compilar en cualquier compilador (yo solo lo probe con g++)

Saludos

Gracias, ya he podido resolver el problema, en otra lista me han ayudado. No les pongo el vínculo porque no tengo privilegios, traten de armarlo, quitándole los espacios.

http : // listas. conclase. net / pipermail / cconclase_listas.conclase.net / 2010-May / 007942 . html