次のように宣言された関数があります。その正確な動作はこれには関係ありません。
template<typename T>
std::pair<int, int>
partition3(T *pT, const int N, const T &Kq, const int w,
std::function<int(const T&, const T&, int)> P);
コールサイトでは、次のことを試みます。
bool partition3_test()
{
struct cmp
{
int operator()(int x, int y, int) const
{ return x-y; }
};
int V1[11] = { 3, 7, 1, 7, 7, 8, 10, 2, 16, 4, 3 },
V2[11] = { 3, 6, 1, 6, 6, 8, 10, 2, 16, 4, 3 };
std::function<int(const int&, const int&, int)> F = cmp();
std::pair<int, int>
p1 = partition3(V1, 11, 7, 0, cmp()),
p2 = partition3(V2, 11, 7, 0, cmp());
return false;
}
コンパイラー(MSVC 2010)の2つの呼び出しについてpartition3
、最後のパラメーターのテンプレート引数を推測できなかったと文句を言います。に置き換えるcmp()
とF
、コードがコンパイルされて正常に動作します。
2つの質問があります:
- なぜエラーが発生するのですか?[コンパイラのバグまたはいくつかの不可解なC++ルール?]
- 最初に明示的に構築せずに同じ効果を達成するにはどうすればよい
F
ですか?
(現在、別のテンプレートパラメータを導入し、そのテンプレートタイプとしてpartition3
宣言することで、問題を解決しました。)P