<html><head><title>Re: [C con Clase] Un error con plantillas en GCC y no en Visual Studio</title>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
</head>
<body>
<span style=" font-family:'Courier New'; font-size: 9pt;">Steven Davidson escribió:<br>
<br>
</span><table>
<tr>
<td width=1 bgcolor= #0000ff><br>
</td>
<td width=861><span style=" font-family:'courier new'; font-size: 9pt;">Hola Gilberto,<br>
<br>
2010/5/10 Gilberto Cuba Ricardo <<a href="mailto:gilbert@hlg.rimed.cu">gilbert@hlg.rimed.cu</a>><br>
 <br>
Gracias nuevamente, pero no entiendo por qué tenga yo que agregar<br>
el typename ahí. Sabe usted de la lógica de esto o tal vez otra<br>
persona pueda aclararme por qué hay que incluir ese typename ahí<br>
entre el "static" y el "register_class<T>".<br>
<br>
 <br>
 <br>
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.<br>
 <br>
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).<br>
 <br>
Te pongo otro ejemplo,<br>
 <br>
template< typename T ><br>
class Algo<br>
{<br>
public:<br>
  typedef T tipo;<br>
};<br>
 <br>
template< typename T ><br>
class Otro<br>
{<br>
public:<br>
  Algo<T>::tipo * var;<br>
};<br>
 <br>
¿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,<br>
 <br>
template< typename T ><br>
class Otro<br>
{<br>
public:<br>
  typename Algo<T>::tipo * var;<br>
};<br>
 <br>
Aquí indicamos que 'Algo<T>::tipo' es un tipo de dato y por tanto 'var' es un puntero a tal tipo de dato.<br>
 <br>
 <br>
Espero haber aclarado la duda.<br>
 <br>
Steven<br>
 </td>
</tr>
</table>
<span style=" font-family:'Courier New'; font-size: 9pt;"><br><br>
Genial; satisfecha la duda.<br>
<br>
<span style=" font-family:'arial'; font-size: 8pt; color: #c0c0c0;"><i>-- <br>
Salu2,<br>
 Gilbert</body>