问题
Possible Duplicate:
std::bind overload resolution
Consider following C++ example
class A
{
public:
int foo(int a, int b);
int foo(int a, double b);
};
int main()
{
A a;
auto f = std::async(std::launch::async, &A::foo, &a, 2, 3.5);
}
This gives 'std::async' : cannot deduce template argument as function argument is ambiguous. How do I resolve this ambiguity??
回答1:
Help the compiler resolve ambiguity telling which overload you want:
std::async(std::launch::async, static_cast<int(A::*)(int,double)>(&A::foo), &a, 2, 3.5);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
or use lambda expression instead:
std::async(std::launch::async, [&a] { return a.foo(2, 3.5); });
回答2:
With the help of std::bind overload resolution I figure out a solution for my question. There are two way of doing this (according to me).
Using
std::bind
std::function<int(int,double)> func = std::bind((int(A::*)(int,double))&A::foo,&a,std::placeholders::_1,std::placeholders::_2); auto f = std::async(std::launch::async, func, 2, 3.5);
Directly using above function binding
auto f = std::async(std::launch::async, (int(A::*)(int, double))&A::foo, &a, 2, 3.5)
来源:https://stackoverflow.com/questions/27033386/stdasync-with-overloaded-functions