可能的重复:
消除对采用 std::functions 的函数的调用的歧义 std::function
的模板参数(签名)不是其类型的一部分吗?
我想重载一个函数,以便可以使用各种不同的 lambda(通常带有更多或更少的参数)自然地调用它。我尝试过的显而易见的事情是:
#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++ 的错误/限制?