1

以下に3つのプロトタイプがあります。最初のもの (コメントアウト) が機能することを期待していましたが、機能しないのはこれだけです (エラーについては、コード内のコメントを参照してください)。私にとってさらに驚くべきことは、両方が存在する場合でも、次の 2 つのいずれかが機能することです。

/////////////////////////////////////////////////
// Prototypes:
/////////////////////////////////////////////////
//  Causes "ambiguous call to overloaded function" at the call site when when one or both  
//  of the below prototypes is also present. Otherwise causes unresolves external
//template<typename T> void func(); 

//  Okay, can have this one AND/OR the below declaration
template<typename T> typename std::enable_if<std::is_integral<T>::value, void>::type func();

//  Also okay, can have this one AND/OR the above declaration
template<typename T> typename std::enable_if<std::is_integral<T>::value, void>::type func();


int main()
{
    func<int>();
}


/////////////////////////////////////////////////
// Definitions:
/////////////////////////////////////////////////
template<typename T> typename std::enable_if<std::is_integral<T>::value, void>::type func() {}

template<typename T> typename std::enable_if<!std::is_integral<T>::value, void>::type func() {}

正しいプロトタイプはどれですか?最初のプロトタイプが機能しないのはなぜですか? 私はVS2010とVS2012を使用しています

4

1 に答える 1

1

最初のものは、別の関数テンプレートを宣言しているため、エラーが発生します。簡単に言えば、enable_if解決される最終的な型だけでなく、すべてのものは署名の一部であるため、異なります。

その最初のテンプレート宣言の定義を提供することはありません。そのため、他のものを入れないと「未解決の外部」エラーが発生します。

他のものを入れると、他のものの1つとこの 1 つが候補になり、両方とも実行可能であり、順序付けされていません。そのため、「あいまいな呼び出し」エラーが発生します。

正しい方法は、定義したもの、つまり、まさに今コメントを外したものを宣言することです。

于 2012-07-18T00:27:25.547 に答える