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ć?