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
}
今、私は実際に以前にこのようなコードを書いたことがあり、どういうわけか直観的に、単に「T」ではなく「typename T」と入力する必要があることを知っていました。ただし、その背後にある実際のロジックを知っておくとよいでしょう。説明したい人はいますか?