Hola Gilberto,<br><br>
<div class="gmail_quote">2010/5/10 Gilberto Cuba Ricardo <span dir="ltr"><<a href="mailto:gilbert@hlg.rimed.cu">gilbert@hlg.rimed.cu</a>></span><br>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">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><font color="#888888"><br></font></blockquote>
<div> </div>
<div> </div>
<div>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.</div>
<div> </div>
<div>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).</div>

<div> </div>
<div>Te pongo otro ejemplo,</div>
<div> </div>
<div>template< typename T ><br>class Algo</div>
<div>{</div>
<div>public:</div>
<div>  typedef T tipo;</div>
<div>};</div>
<div> </div>
<div>template< typename T ><br>class Otro</div>
<div>
<div>{</div>
<div>public:</div>
<div>  Algo<T>::tipo * var;</div>
<div>};</div></div>
<div> </div>
<div>¿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,</div>

<div> </div>
<div>template< typename T ><br>class Otro</div>
<div>
<div>
<div>{</div>
<div>public:</div>
<div>  typename Algo<T>::tipo * var;</div>
<div>};</div></div></div>
<div> </div>
<div>Aquí indicamos que 'Algo<T>::tipo' es un tipo de dato y por tanto 'var' es un puntero a tal tipo de dato.</div>
<div> </div>
<div> </div>
<div>Espero haber aclarado la duda.</div>
<div> </div>
<div>Steven</div>
<div> </div></div>