2013-07-01 12 views
6

Ich erkunde die Unterstützung für C++ 11 auf der g ++ - 4.7 (Ubuntu/Linaro 4.7.3-2ubuntu ~ 12.04, um genau zu sein) und ich finde Unterschiede zu finden.Sollte ich signifikante Unterschiede zwischen Std :: Bind und Boost :: Bind sehen?

Insbesondere dann, wenn ich #include <boost/bind.hpp> kommentieren und systematisch aus Vorkommen von boost::bind mit std::bind in der Asynchron-Client-Beispiel-Boost ASIO, das Programm nicht mehr kompiliert (von http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp genommen) ersetzen.

Eine Erklärung dafür?

+2

Können Sie bitte einen Ersatz machen, die zusammen mit dem Compiler-Fehler (vorzugsweise ein einziger Ersatz) und poste den geänderten Code fehlschlägt? – Praetorian

+0

Ich erinnere mich, unterschiedliche Verhalten mit verschachtelten Bindungen gesehen zu haben. Erinnere dich nicht an die Einzelheiten im Moment. Dies ist jedoch nicht das, worauf Sie hier stoßen. – sehe

Antwort

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

und verwenden boost::asio::stdplaceholders::* statt boost::asio::placeholders::*

+0

Arbeitete wie ein Zauber, vielen Dank! –

4

Es sieht aus wie boost::asio::placeholders kann nicht in Verbindung mit std::bind verwendet werden. Im Beispiel Sie verknüpft haben, tritt der erste Aufruf von boost::bind in dem folgenden Code:

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

einfach boost::bind mit std::bind führt zu einer Reihe von Fehlern zu ersetzen. Um es kompilieren zu lassen, müssen Sie boost::asio::placeholders durch std::placeholders ersetzen.

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

Beachten Sie, dass ich nicht verifiziert habe, dass der Code funktionell identisch ist, nachdem diese Änderungen vorgenommen wurden, nur dass es kompiliert.

Verwandte Themen