Не выполнены требования типа обработчика чтения boost :: asio - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь реализовать обработчик заголовка чтения как функцию-член для обработки входящих данных. Однако во время компиляции мне говорят, что требования к типу не выполняются.

Я проверил документацию надбавки, и подписи функций вроде бы хороши. Я не мог заметить разницу. Однако boost не принимает обработчик как действительный.

.cpp файл:

void tcpclient::read_data() {
    char buffer_[1];
    boost::asio::async_read(_socket, boost::asio::buffer(buffer_, HEADER_LEN),
                            std::bind(&tcpclient::handle_read_header, this,
                                      boost::asio::placeholders::error,
                                      boost::asio::placeholders::bytes_transferred));
}


void tcpclient::handle_read_header(const boost::system::error_code &error, std::size_t bytes_transferred) {
    if (!error) {
        logger::log_info("Read " + std::to_string(bytes_transferred) + " bytes.");
    } else {
        logger::log_error("Failed to read header");
        _socket.close();
    }
}

.h файл:

void handle_read_header(const boost::system::error_code &error, std::size_t bytes_transferred);

    void read_data();

    boost::asio::ip::tcp::socket _socket;

Я бы ожидал, что код прекрасно воспримет подпись обработчика, но вместо этого мне будет предложено:

/usr/include/boost/asio/impl/read.hpp: In instantiation of ‘typename boost::asio::async_result<typename std::decay<WriteHandler>::type, void(boost::system::error_code, long unsigned int)>::return_type boost::asio::async_read(AsyncReadStream&, const MutableBufferSequence&, ReadHandler&&, typename std::enable_if<boost::asio::is_mutable_buffer_sequence<MutableBufferSequence>::value>::type*) [with AsyncReadStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; MutableBufferSequence = boost::asio::mutable_buffers_1; ReadHandler = std::_Bind<void (tcpclient::*(tcpclient*, boost::arg<1> (*)(), boost::arg<2> (*)()))(const boost::system::error_code&, long unsigned int)>; typename boost::asio::async_result<typename std::decay<WriteHandler>::type, void(boost::system::error_code, long unsigned int)>::return_type = void; typename std::enable_if<boost::asio::is_mutable_buffer_sequence<MutableBufferSequence>::value>::type = void]’:
/home/void/Documents/Development/SocketTest/SocketTest/networking/tcpclient.cpp:55:84:   required from here
/usr/include/boost/asio/impl/read.hpp:446:3: error: static assertion failed: ReadHandler type requirements not met
   BOOST_ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check;
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/asio/impl/write.hpp:430:3: error: no match for call to ‘(std::_Bind<void (tcpclient::*(tcpclient*, boost::arg<1> (*)(), boost::arg<2> (*)()))(const boost::system::error_code&, long unsigned int)>) (const boost::system::error_code&, const long unsigned int&)’
   BOOST_ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check;
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1 Ответ

1 голос
/ 18 апреля 2019

Используйте boost::bind с boost::asio::placeholders::..

boost::bind(&tcpclient::handle_read_header, this,
                                  boost::asio::placeholders::error,
                                  boost::asio::placeholders::bytes_transferred));

или std::placeholders::_1/_2 с std::bind:

std::bind(&tcpclient::handle_read_header, this,
                                  std::placeholders::_1,
                                  std::placeholders::_2));
...