应该std :: bind与boost :: asio兼容吗?
我正在尝试使用boost :: asio示例之一来尽可能地使用c ++ 11 / TR1库。 原始代码如下所示:
void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error)); }
如果我用std::bind
replaceboost::bind
,如下所示:
void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_io_service()); acceptor_.async_accept(new_connection->socket(), std::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error ) ); // std::bind(&tcp_server::handle_accept, this, new_connection, _1 ) ); }
我收到一个很大的错误信息,结尾是:
/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'
我正在使用升压版本1.47的GCC版本4.4
我期望boost :: bind和std :: bind是可以互换的。
我现在有一个解决scheme
问题是,当我第一次尝试切换到std::bind
和std::shared_ptr
我仍然使用boost::asio::placeholders
与std::bind
,这导致了大量的模板编译器错误,所以然后我试图零零碎碎。
我第一次尝试切换只是boost::shared_ptr
为std::shared_ptr
,这失败了,因为boost::bind
不会与std::shared_ptr
一起使用的模板get_pointer<typename T>
专业化为std::shared_ptr
(请参阅: 如何解决boost :: shared_ptr和使用std :: shared_ptr?之间的冲突 )。
切换到std :: shared_ptr后,我切换到std::bind
,这次使用std::placeholders
,(感谢理查德)示例代码现在编译和工作正常。
为了使用boost::asio
std::bind
,请确保std::shared_ptr
和std::placeholders
也被使用。