我使用的是CentOS 6.6(gcc 4.4.7),并使用Boost.Asio(1.41)进行开发。我希望io_servicerun()
在m
启动时在管理对象中调用成员函数。我尝试编译的代码如下所示:
#include <memory>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
boost::asio::io_service io;
std::unique_ptr<manager> m;
m = std::make_unique<manager>;
io.post(boost::bind(&manager::run, &m));
gcc符合该boost::bind
声明,其中包括:
/usr/include/boost/bind/mem_fn_template.hpp:40: error: pointer to
member type ‘void (manager::)()’ incompatible with object type
‘std::unique_ptr<manager, std::default_delete<manager> >’
我想在这里做什么?
管理器对象将只知道计时器。知道io_service的单独对象将在以后添加到其构造函数中。但是这个想法是,manager::run()
它将创建一组初始计时器来引导系统。
澄清:
我的想法是,外部代码块管理的生命周期,m
下一条语句将是io.run()
。返回m
时,外部代码将销毁io.run()
。因此,将原始参考传递m
给io
是合适的。但是我是一名现代C ++新手,因此可能会偏离基础。
您需要C ++-14和广义lambda捕获才能完成这项工作-您需要将唯一指针移到lambda中。相反,只使用一个shared_ptr
,它std::bind
理解本身:
std::shared_ptr<manager> m;
m = std::make_shared<manager>();
io.post(std::bind(&manager::run, std::move(m)));
该std::move
是可选的,但保证m
不保存,当它不希望周围的经理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句