Por que você às vezes precisa escrever `typename T` em vez de apenas` T`?
Eu estava lendo o artigo da Wikipedia sobreSFINAE e encontrou o seguinte exemplo de código:
struct Test
{
typedef int Type;
};
template < typename T >
void f( typename T::Type ) {} // definition #1
template < typename T >
void f( T ) {} // definition #2
void foo()
{
f< Test > ( 10 ); //call #1
f< int > ( 10 ); //call #2 without error thanks to SFINAE
}
Agora eu realmente escrevi código como este antes, e de alguma forma intuitivamente eu sabia que precisava digitar "typename T" em vez de apenas "T". No entanto, seria bom saber a lógica real por trás disso. Alguém se importa em explicar?