Я читал статью Wikipedia о SFINAE и обнаружил следующий пример кода:
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
}
Теперь я на самом деле написал такой код раньше, и как-то интуитивно я знал, что мне нужно ввести "typename T" вместо "T". Тем не менее, было бы неплохо узнать фактическую логику этого. Кто-нибудь должен объяснить?