代码之家  ›  专栏  ›  技术社区  ›  ivan.ukr

编译用于创建boost.log格式的代码时出错

  •  0
  • ivan.ukr  · 技术社区  · 6 年前

    我试图在Gbunc7.3.0上编译以下代码,其中Ubuntu 18.04 LTS具有选项-STD= C++ 14:

    auto createLogFormatter()
    {
        boost::log::expressions::stream_type stream;
        stream  << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S  ")
                << boost::log::expressions::attr<int>("Severity")
                << " " // ERROR HERE
                << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID")
                << " "
                << boost::log::expressions::smessage;
        return stream;
    }
    

    出现奇怪的错误:

    Log.cpp:51:13: error: no match for ‘operator<<’ (operand types are ‘boost::log::v2_mt_posix::expressions::aux::make_output_actor<boost::phoenix::actor<boost::log::v2_mt_posix::expressions::aux::attribute_output_terminal<boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0> >, boost::posix_time::ptime, boost::log::v2_mt_posix::fallback_to_none, boost::log::v2_mt_posix::aux::light_function<void(boost::log::v2_mt_posix::basic_formatting_ostream<char>&, const boost::posix_time::ptime&)> > >, boost::log::v2_mt_posix::expressions::attribute_actor<int, boost::log::v2_mt_posix::fallback_to_none, void, boost::phoenix::actor>, int, false>::type {aka boost::phoenix::actor<boost::log::v2_mt_posix::expressions::aux::attribute_output_terminal<boost::phoenix::actor<boost::log::v2_mt_posix::expressions::aux::attribute_output_terminal<boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0> >, boost::posix_time::ptime, boost::log::v2_mt_posix::fallback_to_none, boost::log::v2_mt_posix::aux::light_function<void(boost::log::v2_mt_posix::basic_formatting_ostream<char>&, const boost::posix_time::ptime&)> > >, int, boost::log::v2_mt_posix::fallback_to_none, boost::log::v2_mt_posix::to_log_fun<void> > >}’ and ‘const char [2]’)
         stream  << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S  ")
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 << boost::log::expressions::attr<int>("Severity")
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                 << " "
                 ^~~~~~
    

    根据Boost示例 here ,这样做应该有效:

        expr::stream
            << expr::attr< unsigned int >("LineID")
            << ": <" << logging::trivial::severity
            << "> " << expr::smessage
    

    但我得到了这样的错误。 我做错了什么?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Andrey Semashev    5 年前

    编译器错误可能是由缺少的include引起的。lambda表达式运算符由boost.phoenix in提供 boost/phoenix/operator.hpp . 或者你可以包括 boost/log/expressions.hpp 提供所有boost.log表达式节点和运算符。

    但除此之外,你的 createLogFormatter 函数不正确,因为它丢弃了整个格式化程序表达式。您不应该创建并返回 stream 对象,它只是一个启动格式化程序表达式的终端。您需要返回作为lambda表达式的结果创建的函数对象。

    auto createLogFormatter()
    {
        auto fmt = stream  << boost::log::expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S  ")
                << boost::log::expressions::attr<int>("Severity")
                << " " // ERROR HERE
                << boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID")
                << " "
                << boost::log::expressions::smessage;
        return fmt;
    }
    

    如果要有稳定的返回类型,可以使用 boost::log::formatter 包装表达式。