簡體   English   中英

錯誤編譯代碼以創建boost.log格式

[英]Error compiling code for creating boost.log format

我正在嘗試使用選項-std = c ++ 14在Ubuntu 18.04 LTS上使用gcc 7.3.0編譯以下代碼:

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示例,這樣的事情應該起作用:

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

但是我收到了這樣的錯誤。 我做錯了什么?

缺少包含可能導致編譯器錯誤。 Lambda表達式運算符由Boost.Phoenix在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來包裝表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM