Compila errores usando std :: bind en gcc 4.7

Estoy teniendo muchos problemas usandostd::bind En varios lugares de mi código. A veces funciona, a veces no, así que asumo que estoy haciendo algo fundamentalmente incorrecto.

Por lo que yo entiendo, el siguiente uso básico destd::bind debería funcionar bien:

#include <functional>

int foo(int a, int b){ return a+b; }

int main(){

    using namespace std::placeholders;

    // works
    auto bar_auto=std::bind(foo,1,_2);

    // compile error
    std::function<int(int)> bar_fun=std::bind(foo,1,_2);

    int quux=1;
    // compile error
    std::function<int(int)> bar_fun_lvalue=std::bind(foo,quux,_2);

}

Seguramente el tipo debar_auto esstd::function<int(int)> (tipo defoo con 1int argumento enlazado), entonces porque elbar_fun no compilar? yo incluíbar_fun_lvalue porque algunos google me mostraron quelos valores solían ser problemáticos. Pero esto no solucionó nada.

Se pareceeste error, pero eso es tan viejo que no espero que sea relevante.

La salida de gcc no es particularmente esclarecedora:

En el archivo incluido desde bindnew.cpp: 1: 0: /usr/include/c++/4.7/functional: En la instanciación de 'static _Res std :: _ Function_handler <_Res (_ArgTypes ...), _Functor> :: _ M_invoke (const std :: _ Any_data &, _ArgTypes ...) [with _Res = int; _Functor = std :: _ Bind)) (int, int)>; _ArgTypes = {int}] ': /usr/include/c++/4.7/functional:2298:6: requerido desde' std :: function <_Res (_ArgTypes ...)> :: function (_Functor, typename std :: enable_if <(! std :: is_integral <_Functor> :: value), std :: function <_Res (_ArgTypes ...)> :: _ Useless> :: type) [with _Functor = std :: _ Bind)) (int, int )>; _Res = int; _ArgTypes = {int}; typename std :: enable_if <(! std :: is_integral <_Functor> :: value), std :: function <_Res (_ArgTypes ...)> :: _ Useless> :: type = std :: function :: _ Useless] ' bindnew.cpp: 15: 52: requerido desde aquí /usr/include/c++/4.7/functional:1912:40: error: no hay coincidencia para la llamada a '(std :: _ Bind)) (int, int)>) (int ) '/usr/include/c++/4.7/functional:1140:11: note: los candidatos son: /usr/include/c++/4.7/functional:1211:2: note: template _Result std :: _ Bind <_Functor (_Bound_args. ..)> :: operator () (_ Args && ...) [with _Args = {_Args ...}; _Result = _Result; _Functor = int (*) (int, int); _Bound_args = {int, std :: _ Placeholder <2>}] /usr/include/c++/4.7/functional:1211:2: note:
la deducción / sustitución de los argumentos de la plantilla falló: /usr/include/c++/4.7/functional:1206:35: error: no se puede convertir 'std :: _ No_tuple_element' a 'int' en el argumento que pasa /usr/include/c++/4.7/functional: 1225: 2: nota: plantilla _Resultar std :: _ Bind <_Functor (_Bound_args ...)> :: operator () (_ Args && ...) const [with _Args = {_Args ...}; _Result = _Result; _Functor = int (*) (int, int); _Bound_args = {int, std :: _ Placeholder <2>}] /usr/include/c++/4.7/functional:1225:2: note:
la deducción / sustitución del argumento de la plantilla falló: /usr/include/c++/4.7/functional:1219:35: error: no se puede convertir 'std :: _ No_tuple_element' a 'int' en el argumento que pasa /usr/include/c++/4/4//functional: 1239: 2: note: template _Result std :: _ Bind <_Functor (_Bound_args ...)> :: operator () (_ Args && ...) volatile [with _Args = {_Args ...}; _Result = _Result; _Functor = int (*) (int, int); _Bound_args = {int, std :: _ Placeholder <2>}] /usr/include/c++/4.7/functional:1239:2: note:
la deducción / sustitución del argumento de la plantilla falló: /usr/include/c++/4.7/functional:1233:35: error: no se puede convertir 'std :: _ No_tuple_element' a 'int' en el argumento que pasa /usr/include/c++/4/4//functional: 1253: 2: nota: plantilla _Resultar std :: _ Bind <_Functor (_Bound_args ...)> :: operator () (_ Args && ...) const volatile [with _Args = {_Args ...}; _Result = _Result; _Functor = int (*) (int, int); _Bound_args = {int, std :: _ Placeholder <2>}] /usr/include/c++/4.7/functional:1253:2: nota: sustitución / sustitución de argumento de la plantilla fallida: /usr/include/c++/4/4//functional:1247 : 35: error: no se puede convertir 'std :: _ No_tuple_element' a 'int' en el paso de argumento

Respuestas a la pregunta(2)

Su respuesta a la pregunta