应该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::bindreplaceboost::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也被使用。