Per il compilatore:
ocodice:template < typename TInfo >
è la stessa cosa in questo contesto.codice:template < class TInfo >
Diciamo che typename rende di più l'idea che TInfo sia un dato qualsiasi e non strettamente una classe. Alcuni usano class, altri typename. De gustibus.
Dove cambia però è qui:
Qui il compilatore non può sapere se TCell è da considerare una variabile o un tipo di dato. E poco importa se glielo metti come tipo di ritorno: il compilatore continuerà a chiederselo finché non gli specificherai che TCell è un tipo di dato, usando la keyword typenamecodice:template < typename TInfo > TList<TInfo>::TCell* TList < TInfo >::TCell::GetNextCell() { return NextCell; }
Per inciso, la definizione corretta sarebbe:
o appena userai questo template in più di una unità di compilazione sarà il linker a protestare.codice:template < typename TInfo > inline typename TList<TInfo>::TCell* TList < TInfo >::TCell::GetNextCell() { return NextCell; }