2012-01-19 67 views
41

我想適應其中一個boost :: asio示例,以儘可能使用C++ 11/TR1庫。原來的代碼如下所示:應該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)); 
} 

如果我std::bind取代boost::bind如下:

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

我獲得了大量的錯誤信息,用兩端有:

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

我使用海灣合作委員會版本4.4與升壓版本1.47

我預計boost :: bind和std :: bind可以互換。

+0

std需要很多的提升和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年!我也曾嘗試過這種反對v1.48的boost,並使用std ::佔位符而不是boost :: asio ::佔位符。現在我堅持使用boost :: shared_ptr和boost :: bind for asio代碼。 – mark

回答

23

我現在有一個解決方案

的問題是,當我第一次嘗試切換到std::bindstd::shared_ptr我用仍是boost::asio::placeholdersstd::bind,這導致了大量的模板編譯器錯誤的,所以然後我試圖零零碎碎。

我第一次嘗試轉換隻是boost::shared_ptrstd::shared_ptr,這種失敗,因爲boost::bind不會與std::shared_ptr與制定出模板get_pointer<typename T>的專業化的std::shared_ptr(參見:How to resolve conflict between boost::shared_ptr and using std::shared_ptr?)。

切換到std :: shared_ptr後,我切換到std::bind,這次使用std::placeholders,(感謝richard)示例代碼現在編譯並正常工作。

爲了使用std::bindboost::asio確保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