2013-07-01 13 views
6

Odkrywam wsparcie dla C++ 11 na g ++ - 4.7 (dla Ubuntu/Linaro 4.7.3-2ubuntu ~ 12.04), i wydaje mi się, że znajduję różnice.Czy powinienem zobaczyć znaczne różnice między std :: bind i boost :: bind?

W szczególności, jeśli I ustosunkowania się #include <boost/bind.hpp> i systematycznie wymieniać wystąpienia boost::bind z std::bind w ASIO przykład klient asynchroniczny wzmocnienia (zaczerpnięte z http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp), program nie kompiluje.

Jakiekolwiek wyjaśnienie tego?

+2

Czy należy dokonać wymiany, które nie powiedzie się (najlepiej jeden zamienny) i zakładać zmodyfikowanego kodu wraz z błędem kompilatora? – Praetorian

+0

Pamiętam, że widziałem inne zachowanie z zagnieżdżonymi powiązaniami. Nie przypominaj sobie teraz szczegółów. Jednak to nie jest to, co tu robisz. – sehe

Odpowiedz

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

boost::asio::stdplaceholders::* i używać zamiast boost::asio::placeholders::*

+0

Pracowałem jak urok, wielkie dzięki! –

4

Wygląda na to, że boost::asio::placeholders nie może być używany w połączeniu z std::bind. Na przykład masz związane, pierwsze wywołanie boost::bind występuje w poniższym kodzie:

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

prostu zastępując boost::bind z std::bind prowadzi do kilka błędów. Aby go skompilować, musisz zamienić boost::asio::placeholders na std::placeholders.

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

Należy zauważyć, że nie zweryfikowałem, że kod jest funkcjonalnie taki sam po wprowadzeniu tych zmian, tylko że się kompiluje.

Powiązane problemy