VS2010有boost :: bind问题吗?

时间:2010-11-22 17:35:47

标签: c++ visual-studio-2010 boost bind

我有以下代码行,在2010年之前的g ++和Visual Studio下编译得很好。

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 个答案:

答案 0 :(得分:10)

这可能是因为vector::push_back现在通过支持或C ++ 0x功能有2次重载,导致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);

答案 1 :(得分:4)

MSVC10中存在绑定问题。这不是我见过报告问题的第一篇文章。其次,引入lambdas完全和完全冗余,并且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中使用绑定。