重複の可能性:
std::functions を取る関数の呼び出しを明確にする std::function
のテンプレート引数 (シグネチャ) はその型の一部ではありませんか?
関数をオーバーロードして、さまざまな異なるラムダ (通常は多かれ少なかれ引数を使用) で自然に呼び出すことができるようにしたいと考えています。私が試した明らかなことは次のとおりです。
#include <functional>
#include <iostream>
extern void fn(std::function<void(int)>);
extern void fn(std::function<void(int, int)>);
void test()
{
fn([](int a) { std::cout << "lambda with 1 arg " << a << std::endl; });
}
ただし、これは g++ (v4.6.2 および v4.7.1 を試行) で失敗し、次のエラーが表示されます。
test.cc: In function ‘void test()’:
test.cc:9:74: error: call of overloaded ‘fn(test()::<lambda(int)>)’ is ambiguous
test.cc:9:74: note: candidates are:
test.cc:4:13: note: void fn(std::function<void(int)>)
test.cc:5:13: note: void fn(std::function<void(int, int)>)
こことここで別の (そしてはるかに複雑な) アプローチを見つけましたが、私の質問は、上記のコードが失敗するのはなぜですか? それが機能しないという標準の何かがありますか、それともこれは単にg ++のバグ/制限ですか?