应该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::bindstd::shared_ptr我仍然使用boost::asio::placeholdersstd::bind ,这导致了大量的模板编译器错误,所以然后我试图零零碎碎。

我第一次尝试切换只是boost::shared_ptrstd::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_ptrstd::placeholders也被使用。