2012-01-19 12 views
41

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 es el siguiente:¿Debería std :: bind ser compatible con boost :: asio?

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 sustituyo boost::bind con std::bind de la 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)); 
} 

me sale un mensaje de error grande, con extremos con:

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

soy utilizando la versión 4.4 de gcc con la versión de impulso 1.47

esperaba boost :: bind y std :: bind para ser intercambiable.

+0

std toma mucho de boost y tr1, pero no son lo mismo. Me pregunto si esto tiene algo que ver con [esta pregunta] (http://stackoverflow.com/questions/6653531/workaround-to-allow-tr1function-to-swallow-return-values) – spraff

+0

a [potencialmente relacionado] (https : //svn.boost.org/trac/boost/ticket/3053) boleto –

+0

@Sam Miller Encontré el boleto pero no se ha actualizado durante 3 años. También he intentado esto contra v1.48 de boost, y usando std :: placeholders en lugar de boost :: asio :: placeholders. Por ahora me estoy quedando con boost :: shared_ptr y boost :: bind para el código asio. – mark

Respuesta

23

ahora tengo una solución

El problema es que cuando probé por primera vez para cambiar a std::bind y std::shared_ptr yo todavía estaba usando el boost::asio::placeholders con std::bind, esto dio lugar a una gran cantidad de errores de la plantilla del compilador, por lo Luego intenté cambiar poco a poco.

primera vez que trató de cambiar simplemente boost::shared_ptr-std::shared_ptr, esto fracasó porque boost::bind no funcionará con std::shared_ptr con una especialización de la plantilla para get_pointer<typename T>std::shared_ptr (ver: How to resolve conflict between boost::shared_ptr and using std::shared_ptr?).

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

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

+0

Tenga en cuenta que generalmente cuando se cambia de boost a std :: bind, std :: shared_ptr no es estrictamente necesario. Solo los marcadores de posición son necesarios ya que std :: bind los buscará específicamente. – Whanhee

+1

Probablemente necesite mencionar que boost :: asio :: placeholders :: error debe reemplazarse con std :: placeholders :: _ 1. Ver esta publicación: https://stackoverflow.com/a/28521715/5058676 – evaitl

Cuestiones relacionadas