我正在使用 CentOS 6.6 (gcc 4.4.7) 并且使用 Boost.Asio (1.41) 进行开发。当 io_service 开始运行时,我希望它调用管理对象 m
中的成员函数 run()
。我尝试编译的代码如下:
#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()
。当io.run()
返回时,外部代码将销毁m
。因此,将原始引用传递给io
是合适的。但我是现代C++的新手,可能完全错误。
bind
函数 -- 你需要传递一个普通指针给一个独占指针。但是独占指针必须是唯一的,而在你的代码中,当post
函数返回时,会有两个指向同一个对象的独占指针 -- 一个在bind
中,另一个在m
中。这显然是不正确的。也许你想要使用boost::bind (&manager::run, std::move(m))
? - David Schwartzboost::bind
不知道如何解开unique_ptr
,你需要传递一个manager *
(m.get()
) 或者一个manager
实例 (*m
)(第二个会复制m
指向的对象)。而且我很难相信你正在使用 gcc4.4.7;那个编译器甚至不理解-std=c++11
,更别说std::make_unique
这个 C++14 的新增特性了。 - Praetorian-std=gnu++0x
,而对于make_unique
,我抓取了STL的建议。 - Andreas Yankopolus