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?

questionAnswers(3)

yourAnswerToTheQuestion