ошибки при использовании boost::function с boost::bind с boost::asio

я столкнулся с проблемами при объединении boost::function с boost::bind и 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
          ^

почему компилятор пытается преобразовать boost::asio::io_service в boost::system::error_code ??


person Ravikumar Tulugu    schedule 19.12.2014    source источник


Ответы (1)


Поскольку подпись уже совпадает, нет необходимости использовать boost::bind при назначении boost::function:

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

Обратите внимание, что я изменил последний параметр, потому что он не соответствует константе. Но это не было проблемой.

Как только вы привязываете первые параметры, связанная подпись становится унарной функцией. Это может быть то, что вы хотите передать как обработчик завершения (в зависимости от того, какой должна быть подпись обработчика завершения):

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)>.

person sehe    schedule 19.12.2014