1

オーバーロードされた関数ポインターをパラメーターとしてテンプレート関数に渡そうとしています。

float Function1(float par1)
{
 return 0;  
}

float Function1(float par1, float par2)
{
 return 0;  
}

template<typename R, typename A1>
void Bind(R(*func)(A1))
{
   std::cout << "Correct one called\n";
}

template<typename R, typename A1, typename A2>
void Bind(R(*func)(A1, A2))
{
   std::cout << "False one called\n";
}

int main()
{
 Bind<float, float>(&Function1);
}

2つのfloatパラメーターを使用して関数を明示的に呼び出しても、コンパイラーは正しい呼び出しを解決できないようです。コンパイラは「あいまいな関数呼び出し」エラーを示します。

ここに小さなサンプルを作成しました:http: //liveworkspace.org/code/4kVlUY$195

このエラーの原因は何ですか?ありがとうございました。

4

2 に答える 2

6

Function1のアドレスを取得しようとすると、あいまいさが生じます。コンパイラは2つのオーバーロードを認識し、どちらを参照しているかを認識できません。必要なものを明示的に指定する必要があります。

Bind(
    static_cast<float(*)(float, float)>(&Function1)
);

の呼び出しでテンプレート引数を明示的に示していますがBind、それでは遅すぎます。その時点より前にあいまいさが見つかりました。

于 2013-03-25T11:59:50.270 に答える
4

キャスト式などを使用して、あいまいさを手動で解決する必要があります。

Bind<float, float>( static_cast< float (*)(float par1, float par2)>( &Function1 ));

エラーメッセージによると、それはFunction1あいまいではなく、Bindです。

Compilation finished with errors:
source.cpp:31:4: error: call to 'Bind' is ambiguous
Bind<float, float>(&Function1);
^~~~~~~~~~~~~~~~~~

source.cpp:18:6: note: candidate function [with R = float, A1 = float]
void Bind(R(*func)(A1))
^
source.cpp:24:6: note: candidate function [with R = float, A1 = float, A2 = float]
void Bind(R(*func)(A1, A2))

問題は、2つの引数を指定したことですが、それは自動的に推定される3番目<float, float>の引数の可能性を排除するものではありません。C ++では、同じ関数テンプレート呼び出しに対して明示的および暗黙的な引数を使用できます。

別の解決策は、暗黙の引数を考慮せずにテンプレート名を解決するように強制することです。これも機能しますが、もっとハックです:

(*&Bind<float, float>)(&Function1); // Taking address first hides arguments from deduction
于 2013-03-25T11:59:11.063 に答える