2013-07-01 12 views
6

私はg ++ - 4.7(Ubuntu/Linaro 4.7.3-2ubuntu〜12.04、具体的には)のC++ 11のサポートを模索しています。特にstd :: bindとboost :: bindの間に大きな違いがあるはずですか?

、私は#include <boost/bind.hpp>をコメントアウトし、体系的に(http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cppから取られた)ブーストASIO非同期クライアントの例ではstd::bindboost::bindの出現を交換した場合、プログラムはもはやコンパイルません。

これについての説明はありますか?

+2

boost::asio::stdplaceholders::*を使うのか? – Praetorian

+0

入れ子になったバインドとは異なる動作を見たことがあります。今具体的なことを思い出さないでください。しかし、これはあなたがここまで走っているものではありません。 – sehe

答えて

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::placeholders::*

+0

魅力のように働いて、多くの感謝! –

4

std::bindと組み合わせてboost::asio::placeholdersのように見えます。あなたがリンクした例では、boost::bindへの最初の呼び出しは次のコードで発生します。

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

は単にstd::bindboost::bindを交換すると、エラーの束につながります。コンパイルするには、boost::asio::placeholdersstd::placeholdersに置き換える必要があります。

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

これらの変更を行った後もコードは機能的に同じであることを確認しておらず、コンパイルのみを行っています。

関連する問題