2010-11-22 59 views
5

J'ai eu la ligne de code suivante qui compile très bien sous g ++ et Visual Studio avant 2010.Y at-il des problèmes boost :: bind avec 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); 

Device est une classe, rien de spécial.

Maintenant, je viens de mettre ma version Visual Studio 2010 et échoue compilation avec:

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 

Qu'est-ce qui se passe et comment puis-je résoudre ce problème?

Merci.

+0

quelle version de boost? –

+0

@ Sam Miller: 1,44. – ereOn

Répondre

10

Ceci est probablement dû au fait que vector::push_back a maintenant deux surcharges via le support ou les fonctionnalités C++ 0x, rendant le bind ambigu.

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

Cela devrait fonctionner, ou utiliser la fonction intégrée proposée dans la réponse 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. Merci pour l'explication et la solution. Je n'aurais jamais pensé à un static-cast un pointeur de fonction;) – ereOn

4

Il y a des problèmes avec la liaison à MSVC10. Ce n'est pas le premier article que j'ai vu signaler des problèmes avec cela. Deuxièmement, il est complètement et totalement redondant avec l'introduction de lambdas, et boost :: function a été remplacé par 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); 
}; 

Il n'est pas nécessaire d'utiliser la liaison dans MSVC10.

+0

C'est mieux pour C++ 0x –

+0

btw 'boost :: bind' avec des surcharges de fonction membre ambigu n'est pas seulement problématique dans Visual C++, et +1 pour une alternative élégante –

+0

Il existe de nombreuses raisons d'utiliser la liaison en C++ 0x. –