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