std :: bind overload resolution

El siguiente código funciona bien

#include  using namespace std; using namespace std::placeholders; class A { int operator()( int i, int j ) { return i - j; } }; A a; auto aBind = bind( &A::operator(), ref(a), _2, _1 ); 

Esto no lo hace

 #include  using namespace std; using namespace std::placeholders; class A { int operator()( int i, int j ) { return i - j; } int operator()( int i ) { return -i; } }; A a; auto aBind = bind( &A::operator(), ref(a), _2, _1 ); 

He intentado jugar con la syntax para tratar de resolver explícitamente qué función quiero en el código que no funciona sin suerte hasta el momento. ¿Cómo escribo la línea de enlace para elegir la llamada que toma los dos argumentos enteros?

Necesitas un yeso para eliminar la ambigüedad de la función sobrecargada:

 (int(A::*)(int,int))&A::operator() 

Si tiene disponible C ++ 11, debería preferir lambdas sobre std::bind ya que generalmente da como resultado un código que es más legible:

 auto aBind = [&a](int i, int j){ return a(i, j); }; 

comparado con

 auto aBind = std::bind(static_cast(&A::operator()), std::ref(a), std::placeholders::_2, std::placeholders::_1);