5

以下のコードは、それぞれ 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);
}
4

1 に答える 1

3

これは、ここで報告されているコンパイラのバグです。回避策は次のようです。

このフィードバックを送信していただきありがとうございます。これが有効なコンパイラのバグであることは認識していますが、製品サイクルのこの時点ではトリアージ バーを下回っています。回避策は、宣言した場所でテンプレート関数を定義することです。各翻訳単位のテンプレート関数を再コンパイルすることによるパフォーマンスへの影響が懸念される場合は、PCH ファイルを使用すると、このオーバーヘッドが解消されます。

ありがとう、Mark Roberts Visual C++ チーム

于 2012-06-12T10:24:18.200 に答える