使用 boost::log 输出用户定义的结构

Posted

技术标签:

【中文标题】使用 boost::log 输出用户定义的结构【英文标题】:Outputting user defined structure with boost::log 【发布时间】:2016-10-19 13:30:39 【问题描述】:

我正在尝试使用 boost::log 库输出 boost::asio::streambuf 对象的内容。我通过以下方式定义了 operator 重载:

ostream& operator<<(ostream& ostr, const boost::asio::streambuf& buffer)

    for (size_t i = 0; i < buffer.size(); ++i)
    
        ostr << hex << (int) buffer_cast<const char*>(buffer.data())[i] << " ";
    
    return ostr;

但是在尝试输出缓冲区的内容后:

 BOOST_LOG_TRIVIAL(trace) << buffer;

我有以下错误:

在包含的文件中 /home/bobeff/work/asio_netcomm_poc/third_party/lib/boost/boost/log/sources/record_ostream.hpp:31:0, 来自/home/bobeff/work/asio_netcomm_poc/third_party/lib/boost/boost/log/trivial.hpp:23, 来自/home/bobeff/work/asio_netcomm_poc/server/src/server.cpp:14: /home/bobeff/work/asio_netcomm_poc/third_party/lib/boost/boost/log/utility/formatting_ostream.hpp: 在 'typename 的实例化中 boost::log::v2_mt_posix::aux::enable_if_formatting_ostream::type boost::log::v2_mt_posix::operator;类型名称 boost::log::v2_mt_posix::aux::enable_if_formatting_ostream::type = boost::log::v2_mt_posix::basic_formatting_ostream&]': /home/bobeff/work/asio_netcomm_poc/third_party/lib/boost/boost/log/sources/record_ostream.hpp:212:51: 需要从'类型名 boost::log::v2_mt_posix::aux::enable_if_record_ostream::type boost::log::v2_mt_posix::operator;类型名 boost::log::v2_mt_posix::aux::enable_if_record_ostream::type = boost::log::v2_mt_posix::basic_record_ostream&]' /home/bobeff/work/asio_netcomm_poc/server/src/server.cpp:88:47: 从这里需要 /home/bobeff/work/asio_netcomm_poc/third_party/lib/boost/boost/log/utility/formatting_ostream.hpp:840:19: 错误:无法绑定 'boost::log::v2_mt_posix::basic_formatting_ostream::ostream_type aka std::basic_ostream' 左值到 'std::basic_ostream&&' strm.stream() & std::operator&&, const _Tp&) [与_CharT = char; _Traits = std::char_traits; _Tp = boost::asio::basic_streambuf]' 运算符&& __os, const _Tp& __x) ^

输出缓冲区内容的正确方法是什么?

【问题讨论】:

【参考方案1】:

ADL 找不到您的operator&lt;&lt;。查看this答案的第一部分。

【讨论】:

以上是关于使用 boost::log 输出用户定义的结构的主要内容,如果未能解决你的问题,请参考以下文章

boost::log随笔

提升日志记录集输出级别

Boost Log 1

Boost Log 1

Boost Log : Log record formatting

如何自定义 C++ 类和结构的 STAssertEquals 输出?