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:
#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.