2014-12-19 2 views
0

У меня проблемы с объединением boost :: function with boost :: bind и boost :: asio. я сталкиваюсь с фрагментами кода вниз, компилятор бросает тонны ошибок, я вставляю корневые ошибки.ошибки с использованием boost :: function with boost :: bind with boost :: 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 
     ^

почему компилятор пытается преобразовать повышение :: ASIO :: io_service увеличить :: системы :: error_code ??

ответ

2

Поскольку подпись уже соответствует, нет необходимости использовать повышение :: BIND при назначении для увеличения :: функции:

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

Обратите внимание, что я изменил последний параметр, поскольку он был несовпадающая в Const &/& 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)>

Смежные вопросы