Существуют ли проблемы с Boost :: bind с VS2010? - PullRequest
5 голосов
/ 22 ноября 2010

У меня была следующая строка кода, которая прекрасно компилируется под g ++ и Visual Studio до 2010 года.

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 - это класс, ничего особенного в этом нет.Сейчас я только что обновил свою версию Visual Studio до 2010, и компиляция не удалась:

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

Что происходит и как я могу решить эту проблему?

Спасибо.

Ответы [ 2 ]

10 голосов
/ 22 ноября 2010

Вероятно, это связано с тем, что vector::push_back теперь имеет 2 перегрузки из-за поддержки или функций C ++ 0x, что делает bind неоднозначным.

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

Это должно работать или использовать встроенную функциюпредложено в ответе @ 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);
4 голосов
/ 22 ноября 2010

Есть проблемы с привязкой в ​​MSVC10. Это не первый пост, который я видел, сообщая о проблемах с ним. Во-вторых, это полностью и полностью избыточно с введением лямбд, и boost :: function была заменена на 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);
};

Нет необходимости использовать привязку в MSVC10.

...