2012-01-19 16 views
41

Sto cercando di adattare uno degli esempi boost :: asio per usare le librerie C++ 11/TR1 dove possibile. Il codice originale è simile al seguente:Se std :: bind è compatibile 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)); 
} 

Se sostituisco boost::bind con std::bind come segue:

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

ricevo un messaggio di errore di grandi dimensioni, con le estremità con:

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

Sono utilizzando gcc versione 4.4 con boost versione 1.47

Mi aspettavo boost :: bind e std :: bind per essere intercambiabile.

+0

std richiede molto da boost e tr1, ma non sono uguali. Mi chiedo se questo abbia qualcosa a che fare con [questa domanda] (http://stackoverflow.com/questions/6653531/workaround-to-allow-tr1function-to-swallow-return-values) – spraff

+0

a [potenzialmente correlato] (https : //svn.boost.org/trac/boost/ticket/3053) ticket –

+0

@Sam Miller Ho trovato il biglietto ma non è stato aggiornato per 3 anni! Ho anche provato questo contro la v1.48 di boost, e usando std :: placeholders invece di boost :: asio :: placeholders. Per ora mi sto attenendo con boost :: shared_ptr e boost :: bind per il codice asio. – mark

risposta

23

ora hanno una soluzione

Il problema è che, effettuando la prima di passare a std::bind e std::shared_ptr ero ancora utilizzando la boost::asio::placeholders con std::bind, ciò ha determinato una grande quantità di errori template compilatore, così Allora ho provato a cambiare frammentario.

ho provato il passaggio solo boost::shared_ptr-std::shared_ptr, questo non è riuscita perché boost::bind non funziona con std::shared_ptr con una specializzazione del modello di get_pointer<typename T> per std::shared_ptr (vedi: How to resolve conflict between boost::shared_ptr and using std::shared_ptr?).

Dopo il passaggio a std :: shared_ptr ho quindi passato a std::bind, questa volta utilizzando il std::placeholders, (grazie richard) il codice di esempio ora viene compilato e funziona correttamente.

Per poter utilizzare std::bind con boost::asio assicurarsi che std::shared_ptr e il std::placeholders sono anche utilizzati.

+0

Nota che generalmente quando passi da boost a std :: bind, std :: shared_ptr non è strettamente richiesto. Solo i segnaposto sono necessari in quanto std :: bind li cercherà in modo specifico. – Whanhee

+1

Probabilmente c'è bisogno di menzionare che boost :: asio :: segnaposti :: errore deve essere sostituito con std :: segnaposti :: _ 1. Vedi questo post: https://stackoverflow.com/a/28521715/5058676 – evaitl