我正在尝试调整其中一个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可以互换。
答案 0 :(得分:24)
我现在有了解决方案
问题在于,当我第一次尝试切换到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
(见How to resolve conflict between boost::shared_ptr and using std::shared_ptr?)。
切换到std :: shared_ptr之后我切换到std::bind
,这次使用std::placeholders
,(感谢richard)现在示例代码编译并正常工作。
要将std::bind
与boost::asio
一起使用,请确保同时使用std::shared_ptr
和std::placeholders
。