Should std::bind be compatible with boost::asio?

不想你离开。 提交于 2019-11-28 22:02:38

问题


I am trying to adapt one of the boost::asio examples to use c++11 / TR1 libraries where possible. The original code looks like this:

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));
}

If I replace boost::bind with std::bind as follows:

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 ) );
}

I get a large error message, with ends with:

/usr/include/c++/4.4/tr1_impl/functional:1137: error: return-statement with a value, in function returning 'void'

I am using gcc version 4.4 with boost version 1.47

I expected boost::bind and std::bind to be interchangeable.


回答1:


I now have a solution

The problem is that when I first tried to switch to std::bind and std::shared_ptr I was still using the boost::asio::placeholders with std::bind, this resulted in a large amount of template compiler errors, so I then tried to switch piecemeal.

I first tried switching just boost::shared_ptr to std::shared_ptr, this failed because boost::bind will not work with std::shared_ptr with out a specialisation of the template get_pointer<typename T> for std::shared_ptr (see: How to resolve conflict between boost::shared_ptr and using std::shared_ptr?).

After switching to std::shared_ptr I then switched to std::bind, this time using the std::placeholders, (thanks richard) the example code now compiles and works correctly.

In order to use std::bind with boost::asio make sure that std::shared_ptr and the std::placeholders are also used.



来源:https://stackoverflow.com/questions/8924149/should-stdbind-be-compatible-with-boostasio

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!