以下のコードは、それぞれ 2 つのデフォルト パラメータを持つ 2 つの Foo テンプレートを示しています。Foo1 には別のプロトタイプがあり、Foo2 にはありません。それ以外は同じです。
Foo1 への最初の呼び出しでコンパイラ (VS2010 ネイティブ C++) がエラーを生成し、他の 3 つが機能するのはなぜですか?
#include <limits>
// not needed but to prevent answers in this direction...
#undef max
#undef min
template< typename T >
void Foo1( T v1 = std::numeric_limits< T >::min(), T v2 = std::numeric_limits< T >::max() );
template< typename T >
inline
void Foo1( T v1, T v2 )
{
// ...
}
template< typename T >
inline
void Foo2( T v1 = std::numeric_limits< T >::min(), T v2 = std::numeric_limits< T >::max() )
{
// ...
}
int main()
{
Foo1<int>(0); /* Will cause error C2589: '::' : illegal token on right side of '::' */
Foo1<int>(0, 10);
Foo2<int>(0);
Foo2<int>(0, 10);
}