std :: bind应该与boost :: asio兼容吗?

mar*_*ark 43 c++ boost boost-asio c++11

我正在尝试调整其中一个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));
}
Run Code Online (Sandbox Code Playgroud)

如果我更换boost::bindstd::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 ) );
}
Run Code Online (Sandbox Code Playgroud)

我收到一条大错误消息,结尾为:

/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'
Run Code Online (Sandbox Code Playgroud)

我使用的是增强版1.47的gcc 4.4版

我希望boost :: bind和std :: bind可以互换.

mar*_*ark 26

我现在有一个解决方案

问题是,当我第一次尝试切换到std::bind并且std::shared_ptr我仍在使用boost::asio::placeholderswith时std::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,(感谢richard)示例代码现在编译并正常工作.

为了使用std::bind,请boost::asio确保std::shared_ptrstd::placeholders也使用.

  • 可能需要提一下 boost::asio::placeholders::error 需要替换为 std::placeholders::_1 。看到这个帖子:/sf/answers/1996520081/ (2认同)