2014-12-19 155 views
0

我面臨問題結合boost ::功能與boost :: bind和boost :: asio。我面臨代碼片斷,編譯器會拋出大量錯誤,我正在粘貼根錯誤。錯誤使用升壓::功能與升壓::升壓::綁定:: asio

static void 
startAccept(boost::asio::io_service &io, 
     boost::asio::ssl::context &ctx, 
     boost::asio::ip::tcp::acceptor &acceptor_, 
     const boost::system::error_code &ec 
     ) 
{ 
    //details omitted for brevity reasons. 
    return; 
} 
boost::function<void(
       boost::asio::io_service &, 
       boost::asio::ssl::context &, 
       boost::asio::ip::tcp::acceptor &, 
       boost::system::error_code & 
       )> f; 
     f = boost::bind(&startAccept, 
       boost::ref(io), 
       boost::ref(ctx), 
       boost::ref(acceptor_), 
       boost::asio::placeholders::error); 

錯誤:

In file included from as.cc:5: 
In file included from /usr/local/include/boost/bind.hpp:22: 
/usr/local/include/boost/bind/bind.hpp:457:93: error: no viable conversion from 'boost::asio::io_service' to 
     'const boost::system::error_code' 
     unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); 
                          ^~~~~~~~~~~~~~~~~ 
/usr/local/include/boost/system/error_code.hpp:317:11: note: candidate constructor (the implicit copy constructor) not viable: no known 
     conversion from 'boost::asio::io_service' to 'const boost::system::error_code &' for 1st argument 
    class error_code 
     ^
/usr/local/include/boost/system/error_code.hpp:317:11: note: candidate constructor (the implicit move constructor) not viable: no known 
     conversion from 'boost::asio::io_service' to 'boost::system::error_code &&' for 1st argument 
    class error_code 
     ^

爲什麼編譯器試圖轉換的boost :: ASIO :: io_service對象的boost ::系統:: ERROR_CODE?

回答

2

由於簽名已經匹配,就沒有必要分配,以提高::功能時使用boost ::綁定:

#include <boost/asio.hpp> 
#include <boost/asio/ssl.hpp> 
#include <boost/bind.hpp> 
#include <boost/function.hpp> 

static void startAccept(boost::asio::io_service &io, boost::asio::ssl::context &ctx, 
         boost::asio::ip::tcp::acceptor &acceptor_, boost::system::error_code ec) { 
    // details omitted for brevity reasons. 
    return; 
} 

int main() { 
    boost::function<void(boost::asio::io_service &, boost::asio::ssl::context &, boost::asio::ip::tcp::acceptor &, 
      boost::system::error_code)> f; 

    f = &startAccept; 
} 

注意,我改變了最後一個參數,因爲它是在常量&不匹配/ & ness。但這不是問題。

一旦你綁定了第一個參數,綁定簽名變成了一元函數。這可能是你想傳遞的completionhandler什麼(這取決於什麼completionhandler簽名應該是):

object.async_operation(bufs, boost::bind(f, 
      boost::ref(io), boost::ref(ctx), boost::ref(acceptor_), 
      boost::asio::placeholders::error)) 

在這種情況下,它是一個一元完成處理程序,兼容boost::function<void(boost::system::error_code)>