2010-11-22 8 views
5

tuve la línea siguiente código que compila bien bajo g ++ y Visual Studio antes de 2010.¿Hay problemas boost :: bind con VS2010?

std::vector<Device> device_list; 

boost::function<void (Device&, boost::posix_time::time_duration&)> callback = 
    boost::bind(&std::vector<Device>::push_back, &device_list, _1); 

Dónde Device es una clase, nada de especial.

Ahora Acabo de actualizar mi versión de Visual Studio 2010 y la compilación falla con:

Error 1 error C2780: 'boost::_bi::bind_t<_bi::dm_result<MT::* ,A1>::type,boost::_mfi::dm<M,T>,_bi::list_av_1<A1>::type> boost::bind(M T::* ,A1)' : expects 2 arguments - 3 provided C:\developments\libsystools\trunk\src\upnp_control_point.cpp 95 

Lo que está pasando y cómo puedo solucionar esto?

Gracias.

+0

¿qué versión de impulso? –

+0

@Sam Miller: 1.44. – ereOn

Respuesta

10

Esto es probablemente porque vector::push_back ahora tiene 2 sobrecargas a través de funciones de soporte o C++ 0x, por lo que el bind es ambiguo.

void push_back(
    const Type&_Val 
); 
void push_back(
    Type&&_Val 
); 

Esto debería funcionar, o utilizar la función incorporada se sugiere en la respuesta de @ DeadMG:

std::vector<Device> device_list; 

boost::function<void (Device&, boost::posix_time::time_duration&)> callback = 
    boost::bind(static_cast<void (std::vector<Device>::*)(const Device&)> 
    (&std::vector<Device>::push_back), &device_list, _1); 
+1

+1. Gracias por la explicación y la solución. Nunca hubiera pensado fundir estático un puntero de función;) – ereOn

4

hay problemas con la unión en MSVC10. Esta no es la primera publicación que he visto al reportar problemas con ella. En segundo lugar, es totalmente y totalmente redundante con la introducción de lambdas, y la función boost :: ha sido reemplazada por std :: function.

std::vector<Device> devices; 
std::function<void (Device&, boost::posix_time::time_duration&)> callback = [&](Device& dev, boost::posix_time::time_duration& time) { 
    devices.push_back(dev); 
}; 

No es necesario utilizar el enlace en MSVC10.

+0

Esto es mejor para C++ 0x –

+0

btw 'boost :: bind' con sobrecargas de función de miembro ambiguas no es solo problemático en Visual C++, y +1 para alternativa elegante –

+0

Hay muchas razones para usar el enlace en C++ 0x. –

Cuestiones relacionadas