std :: associa una funzione associata

Sto avendo problemi a scoprire perché diavolo non si sta compilando. Ho una funzione lambda che restituisce una std::function basata su alcuni argomenti.

Ho ristretto il mio problema a questo snippet (che non usa lambdas, ma riproduce perfettamente il mio errore):

 #include  #include  struct foo { template void bar(T data) { std::cout << data << "\n"; } }; void some_fun(const std::function &f) { f(12); } int main() { foo x; auto f = std::bind(&foo::bar, x, std::placeholders::_1); auto w = std::bind(some_fun, f); w(); } 

La chiamata a w() produce uno di quegli adorabili output di errore di gcc in cui non riesco a capire cosa non va. Questo è l’errore echeggiato da gcc 4.6.1:

 g++ -std=c++0x test.cpp -o test test.cpp: In function 'int main()': test.cpp:20:7: error: no match for call to '(std::_Bind<void (*(std::_Bind<std::_Mem_fn(foo, std::_Placeholder)>))(const std::function&)>) ()' /usr/include/c++/4.6/functional:1130:11: note: candidates are: /usr/include/c++/4.6/functional:1201:2: note: template _Result std::_Bind::operator()(_Args&& ...) [with _Args = {_Args ...}, _Result = _Result, _Functor = void (*)(const std::function&), _Bound_args = {std::_Bind<std::_Mem_fn(foo, std::_Placeholder)>}] /usr/include/c++/4.6/functional:1215:2: note: template _Result std::_Bind::operator()(_Args&& ...) const [with _Args = {_Args ...}, _Result = _Result, _Functor = void (*)(const std::function&), _Bound_args = {std::_Bind<std::_Mem_fn(foo, std::_Placeholder)>}] /usr/include/c++/4.6/functional:1229:2: note: template _Result std::_Bind::operator()(_Args&& ...) volatile [with _Args = {_Args ...}, _Result = _Result, _Functor = void (*)(const std::function&), _Bound_args = {std::_Bind<std::_Mem_fn(foo, std::_Placeholder)>}] /usr/include/c++/4.6/functional:1243:2: note: template _Result std::_Bind::operator()(_Args&& ...) const volatile [with _Args = {_Args ...}, _Result = _Result, _Functor = void (*)(const std::function&), _Bound_args = {std::_Bind<std::_Mem_fn(foo, std::_Placeholder)>}] 

Qui, f dovrebbe essere un object callable che prende un int come argomento e chiama x.bar(int) usandolo. D’altra parte, w è solo un object callable che chiama some_fun(f) , essendo f l’object callable menzionato sopra, che ha la firma prevista dal some_fun di some_fun .

Mi sto perdendo qualcosa? Probabilmente non so come mescolare effettivamente std::bind e std::function .