• Viernes 17 de Abril de 2026, 11:09

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - gilberto.cuba

Páginas: [1]
1
C/C++ / Un error con plantillas en GCC y no en Visual Studio
« en: Viernes 28 de Mayo de 2010, 17:28 »
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.

Páginas: [1]