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.