Dlaczego czasami musisz napisać `typename T` zamiast` T`?

Czytałem artykuł na WikipediiSFINAE i napotkał następujący przykładowy kod:

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
}

Teraz napisałem już taki kod i intuicyjnie wiedziałem, że muszę wpisać „typename T” zamiast „T”. Jednak byłoby miło poznać prawdziwą logikę, która za tym stoi. Czy ktoś chce wyjaśnić?

questionAnswers(3)

yourAnswerToTheQuestion