Programación General > C/C++
Un error con plantillas en GCC y no en Visual Studio
(1/1)
gilberto.cuba:
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++ --- #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 Anttypename R: %s nttypename T: %sn", 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("ccn");[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: %dn", 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.
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
--- Código: C++ --- #include <stdio.h>#include <typeinfo> template <typename T, typename R>class A{public: virtual T cc() = 0; A(){} ~A(){}public: T method() { T t = T(); R r = R(); printf( "class Anttypename R: %s nttypename T: %sn", typeid(t).name(), typeid(r).name() ); return t; } }; template <typename T, typename P = void>class C : public A<T,P>{public: C() {} ~C(){}public: T cc() { printf("ccn"); T t = this->method(); return t; }}; int main(){ C<int, char> *c; c = new C<int, char>(); int i = c->cc(); printf("i value: %dn", i); return 0;}
gilberto.cuba:
--- 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
--- Fin de la cita ---
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
Navegación
Ir a la versión completa