[C con Clase] Un error con plantillas en GCC y no en Visual Studio

Steven Davidson srd4121 en njit.edu
Lun Mayo 10 13:32:12 CEST 2010


Hola Gilberto,

2010/5/10 Gilberto Cuba Ricardo <gilbert en hlg.rimed.cu>


> Gracias nuevamente, pero no entiendo por qué tenga yo que agregar
> el typename ahí. Sabe usted de la lógica de esto o tal vez otra
> persona pueda aclararme por qué hay que incluir ese typename ahí
> entre el "static" y el "register_class<T>".
>
>

El error que tenías antes no era por problema del compilador sino por el
lenguaje en sí. En este caso que presentas, se crea una ambigüedad, que el
compilador no puede solucionar.

Ten presente que al definir una plantilla, ésta no existe hasta que el
compilador necesite generar una clase o función a partir de dicha plantilla.
Por lo tanto, cualquier mención a tipos como miembros de una clase-plantilla
provoca ambigüedad porque aún no se ha definido tal tipo, hasta que se
genere la clase-plantilla. En tu caso, 'register_class<T>' no existe todavía
y por tanto el compilador no sabe qué es exactamente
'register_class<T>::type'. Este miembro podría ser un puntero a una función,
una clase, o una variable. Para establecer que se trata de un tipo de dato,
debes indicar 'typename' antes de usar este miembro. Por defecto, C++ supone
que se trata de una variable (u objeto).

Te pongo otro ejemplo,

template< typename T >
class Algo
{
public:
  typedef T tipo;
};

template< typename T >
class Otro
 {
public:
  Algo<T>::tipo * var;
};

¿Estamos definiendo que 'var' es un puntero o estamos multiplicando
'Algo<T>::tipo' por 'var'? Recuerda que el compilador aún no sabe lo que es
'Algo<T>' ni por tanto sus miembros exactamente. Para eliminar la
ambigüedad, escribimos 'typename'; esto es,

template< typename T >
class Otro
 {
public:
  typename Algo<T>::tipo * var;
};

Aquí indicamos que 'Algo<T>::tipo' es un tipo de dato y por tanto 'var' es
un puntero a tal tipo de dato.


Espero haber aclarado la duda.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100510/210dbf3a/attachment-0001.html>


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