2012-01-19 18 views
41

私は、可能であれば、C++ 11/TR1ライブラリを使用するためにboost :: asioの例の1つを適応しようとしています。元のコードは次のようになります。私はstd::bindboost::bindを交換した場合std :: bindは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)); 
} 

次のように:

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

私は:

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

は、私は終了して、大規模なエラーメッセージが表示されますgccバージョン4.4をブーストバージョン1.47で使用する

boost :: bindとstd :: bindは互換性があります。

+0

stdはboostとtr1から多くを取りますが、同じではありません。私はこれが[この質問]と関係があるのだろうか?(http://stackoverflow.com/questions/6653531/workaround-to-allow-tr1function-to-swallow-return-values) – spraff

+0

[潜在的に関連する](https ://svn.boost.org/trac/boost/ticket/3053)ticket –

+0

@Sam Millerチケットを見つけましたが、3年間更新されていません!私はboostのv1.48に対してこれを試して、boost :: asio :: placeholdersの代わりにstd :: placeholdersを使用しました。今のところ私はboost :: shared_ptrとboost :: bindをasioコード用にしています。 – mark

答えて

23

私は今ので、私は最初、私はまだboost::asio::placeholdersstd::bindとを使用していたstd::bindstd::shared_ptrに切り替えるしようとしたとき

問題は、これはテンプレートのコンパイルエラーが大量になったされていることソリューションを持っています私はその後、少しずつ切り替えようとしました。

私は最初だけboost::shared_ptrstd::shared_ptrへの切り替えを試みたboost::bindは(:How to resolve conflict between boost::shared_ptr and using std::shared_ptr?を参照)std::shared_ptrためのテンプレートget_pointer<typename T>の専門外でstd::shared_ptrでは動作しませんので、これは失敗しました。

std :: shared_ptrに切り替えた後、std::bindに変更しました。今度はstd::placeholders(ありがとうリチャード)を使用して、サンプルコードがコンパイルされて正しく動作します。 boost::asiostd::bindを使用するためには

std::shared_ptrstd::placeholdersも使用されていることを確認してください。

+0

一般に、boostからstd :: bindに切り替えるときは、std :: shared_ptrは厳密には必須ではないことに注意してください。 std :: bindはそれらを特別に探すのでプレースホルダだけが必要です。 – Whanhee

+1

おそらくboost :: asio :: placeholders :: errorをstd :: placeholders :: _ 1に置き換える必要があることを言及する必要があります。この記事をご覧ください:https://stackoverflow.com/a/28521715/5058676 – evaitl

関連する問題