Проблема не с тем, как один происходит от boost::asio::streambuf
. Вместо этого результирующая ошибка связана с тем, что компилятор выбирает перегрузку non-streambuf write(SyncWriteStream&, const ConstBufferSequence&)
вместо write(SyncWriteStream&, basic_streambuf<Allocator>&)
. Чтобы решить эту проблему, можно явно привести объект, производный от boost::asio::streambuf
к ссылке boost::asio::streambuf
при вызове write()
:
class derived_streambuf
: public boost::asio::streambuf
{};
// ...
derived_streambuf streambuf;
boost::asio::write(socket, static_cast<boost::asio::streambuf&>(streambuf));
Чтобы понять этот вопрос, рассмотрит заявление перегруженной функции в вопросе:
// ConstBufferSequence
template<
typename SyncWriteStream,
typename ConstBufferSequence>
std::size_t write(
SyncWriteStream&,
const ConstBufferSequence&);
// Streambuf
template<
typename SyncWriteStream,
typename Allocator>
std::size_t write(
SyncWriteStream&,
basic_streambuf<Allocator>&);
Если derived_streambuf
предоставляется в качестве второго аргумента, создание функций приведет к:
// ConstBufferSequence
std::size_t write(..., derived_streambuf&);
// Streambuf
std::size_t write(..., basic_streambuf<char>&);
Что касается компилятора, то первое является лучшим совпадением, так как оно является точным совпадением и, следовательно, оно выбрано.
Вот полный пример demonstrating код, который составляет:
#include <boost/asio.hpp>
// Derive from boost::asio::streambuf.
class derived_streambuf
: public boost::asio::streambuf
{};
// Helper function to force type.
template <typename Allocator>
boost::asio::basic_streambuf<Allocator>&
as_streambuf(boost::asio::basic_streambuf<Allocator>& streambuf)
{
return streambuf;
}
int main()
{
boost::asio::io_service io_service;
boost::asio::ip::tcp::socket socket(io_service);
derived_streambuf streambuf;
boost::asio::write(socket, static_cast<boost::asio::streambuf&>(streambuf));
boost::asio::write(socket, as_streambuf(streambuf));
}
Как использовать 'my_super_streambuf'? Что такое 'ConstBufferSequence' в неудавшемся экземпляре? – aschepler