2013-07-01 17 views
6

Sto esplorando il supporto per C++ 11 sul g ++ - 4.7 (Ubuntu/Linaro 4.7.3-2ubuntu ~ 12.04, per essere precisi) e mi sembra di trovare delle differenze.Dovrei vedere differenze significative tra std :: bind e boost :: bind?

In particolare, se io commento #include <boost/bind.hpp> e sostituire sistematicamente le occorrenze di boost::bind con std::bind nella Boost ASIO esempio di client asincroni (tratto da http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp), il programma non viene compilato.

Qualche spiegazione per questo?

+2

Potete per favore fare una sostituzione che non riesce (preferibilmente una singola sostituzione) e inserisci il codice modificato insieme con l'errore del compilatore? – Praetorian

+0

Ricordo di aver visto un comportamento diverso con i binding nidificati. Non ricordare le specifiche al momento. Tuttavia, questo è _non_ quello che stai incontrando qui. – sehe

risposta

7
#include <functional> 
namespace boost { 
    namespace asio { 
     namespace stdplaceholders { 
      static decltype (:: std :: placeholders :: _1) & error = :: std :: placeholders :: _1; 
      static decltype (:: std :: placeholders :: _2) & bytes_transferred = :: std :: placeholders :: _2; 
      static decltype (:: std :: placeholders :: _2) & iterator = :: std :: placeholders :: _2; 
      static decltype (:: std :: placeholders :: _2) & signal_number = :: std :: placeholders :: _2; 
     } 
    } 
} 

e utilizzare boost::asio::stdplaceholders::* invece di boost::asio::placeholders::*

+0

Ha funzionato come un incantesimo, molte grazie! –

4

Sembra che boost::asio::placeholders non possa essere utilizzato insieme a std::bind. Nell'esempio che hai collegato a, la prima chiamata a boost::bind avviene nel seguente codice:

resolver_.async_resolve(query, 
    boost::bind(&client::handle_resolve, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::iterator)); 

Semplicemente sostituendo boost::bind con std::bind porta ad una serie di errori. Per compilare è necessario sostituire boost::asio::placeholders con std::placeholders.

resolver_.async_resolve(query, 
    std::bind(&client::handle_resolve, this, 
     std::placeholders::_1, 
     std::placeholders::_2)); 

Nota che non ho verificato che il codice è funzionalmente lo stesso dopo aver fatto queste modifiche, ma solo che si compila.