编译创建 boost.log 格式的代码时出错
Error compiling code for creating boost.log format
我正在尝试使用 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 示例 here,这样的事情应该可行:
expr::stream
<< expr::attr< unsigned int >("LineID")
<< ": <" << logging::trivial::severity
<< "> " << expr::smessage
但是我收到这样的错误。
我做错了什么?
编译器错误可能是由缺少包含引起的。 Lambda 表达式运算符由 boost/phoenix/operator.hpp
中的 Boost.Phoenix 提供。或者您可以只包含 boost/log/expressions.hpp
,它提供所有 Boost.Log 表达式节点和运算符。
但除此之外,您的 createLogFormatter
函数不正确,因为它丢弃了整个格式化程序表达式。您不应该创建和 returning 一个 stream
对象,它只是一个启动格式化程序表达式的终端。您需要 return 作为 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;
}
如果你想有一个稳定的return类型,你可以用boost::log::formatter
来包裹表达式。
我正在尝试使用 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 示例 here,这样的事情应该可行:
expr::stream
<< expr::attr< unsigned int >("LineID")
<< ": <" << logging::trivial::severity
<< "> " << expr::smessage
但是我收到这样的错误。 我做错了什么?
编译器错误可能是由缺少包含引起的。 Lambda 表达式运算符由 boost/phoenix/operator.hpp
中的 Boost.Phoenix 提供。或者您可以只包含 boost/log/expressions.hpp
,它提供所有 Boost.Log 表达式节点和运算符。
但除此之外,您的 createLogFormatter
函数不正确,因为它丢弃了整个格式化程序表达式。您不应该创建和 returning 一个 stream
对象,它只是一个启动格式化程序表达式的终端。您需要 return 作为 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;
}
如果你想有一个稳定的return类型,你可以用boost::log::formatter
来包裹表达式。