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

时间:2012-01-19 10:04:49

标签: c++ boost c++11 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));
}

如果我将boost::bind替换为std::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'

我正在使用gcc版本4.4和升级版本1.47

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

1 个答案:

答案 0 :(得分:24)

我现在有了解决方案

问题在于,当我第一次尝试切换到std::bindstd::shared_ptr时,我仍然使用boost::asio::placeholdersstd::bind,这导致了大量的模板编译器错误,所以我尝试切换零碎。

我首先尝试仅将boost::shared_ptr切换为std::shared_ptr,但这失败了,因为boost::bind无法与std::shared_ptr一起使用而没有模板get_pointer<typename T>的专业化std::shared_ptr(见How to resolve conflict between boost::shared_ptr and using std::shared_ptr?)。

切换到std :: shared_ptr之后我切换到std::bind,这次使用std::placeholders,(感谢richard)现在示例代码编译并正常工作。

要将std::bindboost::asio一起使用,请确保同时使用std::shared_ptrstd::placeholders