c++ boost c++11 boost-asio

c++ - ¿Debería std:: bind ser compatible con boost:: asio?



c++11 boost-asio (1)

Estoy tratando de adaptar uno de los ejemplos de boost :: asio para usar librerías c ++ 11 / TR1 cuando sea posible. El código original se ve así:

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

Si reemplazo boost::bind con std::bind siguiente manera:

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

Aparece un gran mensaje de error, que termina con:

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

Estoy usando la versión 4.4 de gcc con la versión de impulso 1.47

Esperaba que boost :: bind y std :: bind fueran intercambiables.


Ahora tengo una solución

El problema es que la primera vez que intenté cambiar a std::bind y std::shared_ptr seguí usando boost::asio::placeholders con std::bind , esto dio como resultado una gran cantidad de errores en el compilador de plantillas, por lo que Luego intenté cambiar poco a poco.

Primero intenté cambiar solo boost::shared_ptr a std::shared_ptr , esto falló porque boost::bind no funcionará con std::shared_ptr sin una especialización de la plantilla get_pointer<typename T> para std::shared_ptr (ver: ¿Cómo resolver el conflicto entre boost :: shared_ptr y using std :: shared_ptr? ).

Después de cambiar a std :: shared_ptr, cambié a std::bind , esta vez usando std::placeholders , (gracias richard) el código de ejemplo ahora se compila y funciona correctamente.

Para usar std::bind con boost::asio asegúrese de que std::shared_ptr y std::placeholders también se usan.