错误:尝试使用 boost::asio::async_read 读取时,"类提升::ASIO::mutable_buffer"中没有名为"const_iterator"的类型

error: no type named 'const_iterator' in 'class boost::asio::mutable_buffer' when trying to read using boost::asio::async_read

本文关键字:buffer ASIO mutable 类型 iterator const boost asio async read 错误      更新时间:2023-10-16

使用此代码编译错误。这很奇怪,因为它基本上是从我的另一个项目复制粘贴的。有什么线索吗?

void Connection::asyncReceiveHeader()
{
    Buffer* header = new Buffer(packetHeaderSize);
    ba::mutable_buffer buffer = ba::buffer(header->pointer(), header->size());
    auto readHandler = bind(&Connection::headerReceived, this, ba::placeholders::error, ba::placeholders::bytes_transferred, header);
    ba::async_read(socket, buffer, readHandler); // Comment this line out and it compiles (this is the line 70)
}

错误:

C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp: In instantiation of 'class boost::asio::detail::consuming_buffers<boost::asio::mutable_buffer, boost::asio::mutable_buffer>':
C:MinGWlibrariesboost-1.52include/boost/asio/impl/read.hpp:209:46:   required from 'class boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::mutable_buffer, boost::asio::detail::transfer_all_t, boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > > >'
C:MinGWlibrariesboost-1.52include/boost/asio/impl/read.hpp:526:3:   required from 'void boost::asio::async_read(AsyncReadStream&, const MutableBufferSequence&, ReadHandler&&) [with AsyncReadStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; MutableBufferSequence = boost::asio::mutable_buffer; ReadHandler = boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > >&]'
..srcnetworkConnection.cpp:70:45:   required from here
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:150:5: error: no type named 'const_iterator' in 'class boost::asio::mutable_buffer'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:247:36: error: no type named 'const_iterator' in 'class boost::asio::mutable_buffer'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp: In instantiation of 'boost::asio::detail::consuming_buffers<Buffer, Buffers>::consuming_buffers(const Buffers&) [with Buffer = boost::asio::mutable_buffer; Buffers = boost::asio::mutable_buffer]':
C:MinGWlibrariesboost-1.52include/boost/asio/impl/read.hpp:158:60:   required from 'boost::asio::detail::read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, ReadHandler>::read_op(AsyncReadStream&, const MutableBufferSequence&, CompletionCondition, ReadHandler&) [with AsyncReadStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; MutableBufferSequence = boost::asio::mutable_buffer; CompletionCondition = boost::asio::detail::transfer_all_t; ReadHandler = boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > >]'
C:MinGWlibrariesboost-1.52include/boost/asio/impl/read.hpp:497:61:   required from 'boost::asio::detail::read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, ReadHandler> boost::asio::detail::make_read_op(AsyncReadStream&, const MutableBufferSequence&, CompletionCondition, ReadHandler) [with AsyncReadStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; MutableBufferSequence = boost::asio::mutable_buffer; CompletionCondition = boost::asio::detail::transfer_all_t; ReadHandler = boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > >]'
C:MinGWlibrariesboost-1.52include/boost/asio/impl/read.hpp:526:3:   required from 'void boost::asio::async_read(AsyncReadStream&, const MutableBufferSequence&, ReadHandler&&) [with AsyncReadStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; MutableBufferSequence = boost::asio::mutable_buffer; ReadHandler = boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > >&]'
..srcnetworkConnection.cpp:70:45:   required from here
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:157:58: error: 'class boost::asio::mutable_buffer' has no member named 'end'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:157:58: error: 'class boost::asio::mutable_buffer' has no member named 'begin'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:157:58: error: using invalid field 'boost::asio::detail::consuming_buffers<Buffer, Buffers>::begin_remainder_'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:157:58: error: 'class boost::asio::mutable_buffer' has no member named 'begin'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:161:7: error: 'class boost::asio::mutable_buffer' has no member named 'begin'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:162:7: error: using invalid field 'boost::asio::detail::consuming_buffers<Buffer, Buffers>::begin_remainder_'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp: In instantiation of 'boost::asio::detail::consuming_buffers<Buffer, Buffers>::consuming_buffers(const boost::asio::detail::consuming_buffers<Buffer, Buffers>&) [with Buffer = boost::asio::mutable_buffer; Buffers = boost::asio::mutable_buffer; boost::asio::detail::consuming_buffers<Buffer, Buffers> = boost::asio::detail::consuming_buffers<boost::asio::mutable_buffer, boost::asio::mutable_buffer>]':
C:MinGWlibrariesboost-1.52include/boost/asio/impl/read.hpp:177:67:   required from 'boost::asio::detail::read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, ReadHandler>::read_op(boost::asio::detail::read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, ReadHandler>&&) [with AsyncReadStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; MutableBufferSequence = boost::asio::mutable_buffer; CompletionCondition = boost::asio::detail::transfer_all_t; ReadHandler = boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > >; boost::asio::detail::read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, ReadHandler> = boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp>, boost::asio::mutable_buffer, boost::asio::detail::transfer_all_t, boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > > >]'
C:MinGWlibrariesboost-1.52include/boost/asio/impl/read.hpp:497:61:   required from 'boost::asio::detail::read_op<AsyncReadStream, MutableBufferSequence, CompletionCondition, ReadHandler> boost::asio::detail::make_read_op(AsyncReadStream&, const MutableBufferSequence&, CompletionCondition, ReadHandler) [with AsyncReadStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; MutableBufferSequence = boost::asio::mutable_buffer; CompletionCondition = boost::asio::detail::transfer_all_t; ReadHandler = boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > >]'
C:MinGWlibrariesboost-1.52include/boost/asio/impl/read.hpp:526:3:   required from 'void boost::asio::async_read(AsyncReadStream&, const MutableBufferSequence&, ReadHandler&&) [with AsyncReadStream = boost::asio::basic_stream_socket<boost::asio::ip::tcp>; MutableBufferSequence = boost::asio::mutable_buffer; ReadHandler = boost::_bi::bind_t<void, boost::_mfi::mf3<void, network::Connection, const boost::system::error_code&, unsigned int, network::Buffer*>, boost::_bi::list4<boost::_bi::value<network::Connection*>, boost::arg<1> (*)(), boost::arg<2> (*)(), boost::_bi::value<network::Buffer*> > >&]'
..srcnetworkConnection.cpp:70:45:   required from here
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:172:32: error: using invalid field 'boost::asio::detail::consuming_buffers<Buffer, Buffers>::begin_remainder_'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:172:32: error: 'class boost::asio::mutable_buffer' has no member named 'begin'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:174:38: error: no type named 'const_iterator' in 'class boost::asio::mutable_buffer'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:175:38: error: no type named 'const_iterator' in 'class boost::asio::mutable_buffer'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:176:5: error: using invalid field 'boost::asio::detail::consuming_buffers<Buffer, Buffers>::begin_remainder_'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:174:38: error: no type named 'const_iterator' in 'class boost::asio::mutable_buffer'
C:MinGWlibrariesboost-1.52include/boost/asio/detail/consuming_buffers.hpp:175:38: error: no type named 'const_iterator' in 'class boost::asio::mutable_buffer'

async_read()自由函数的buffer参数需要满足MutableBuffer序列的要求。你应该用mutable_buffers_1而不是mutable_buffer

void Connection::asyncReceiveHeader()
{
    Buffer* header = new Buffer(packetHeaderSize);
    ba::mutable_buffers_1 buffer = ba::buffer(header->pointer(), header->size());
    auto readHandler = bind(&Connection::headerReceived, this, ba::placeholders::error, ba::placeholders::bytes_transferred, header);
    ba::async_read(socket, buffer, readHandler);
}