Ошибка компиляции кода для создания формата boost.log - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь скомпилировать следующий код с gcc 7.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 здесь , такая вещь должна работать:

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

Но я получаю такую ​​ошибку. Что я делаю не так?

1 Ответ

0 голосов
/ 23 января 2019

Ошибка компилятора, вероятно, вызвана отсутствующим включением.Операторы лямбда-выражения предоставляются Boost.Phoenix в boost/phoenix/operator.hpp.Или вы можете просто включить boost/log/expressions.hpp, который предоставляет все узлы выражения Boost.Log, а также операторы.

Но, кроме того, ваша функция createLogFormatter неверна, поскольку отбрасывает все выражение форматирования.Вы не должны создавать и возвращать объект stream, это только терминал, который запускает выражение форматирования.Вам необходимо вернуть объект функции, созданный в результате лямбда-выражения.

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 для переноса выражения.

...