2014-12-19 157 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)>