ошибка компиляции неконстантного битового поля лога повышения (проблема обратной совместимости)

Я взял пример с http://www.boost.org/doc/libs/1_61_0/libs/log/example/doc/tutorial_trivial_flt.cpp и добавил печать битового поля:

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>

namespace logging = boost::log;

//[ example_tutorial_trivial_with_filtering
void init()
{
logging::core::get()->set_filter
(
logging::trivial::severity >= logging::trivial::info
);
}struct BF {
unsigned int b : 8;
BF() : b(0) {}
};int main(int, char*[])
{
init();

BF bf;
BOOST_LOG_TRIVIAL(info) << "An informational severity message " << bf.b;

return 0;
}
//]

С boost 1.61 я получил ошибку компиляции:

не может привязать битовое поле ‘bf.BF::b’ к ‘unsigned int&’

С бустом 1.57 код компилируется и запускается (печатает: [2016-09-19 20: 21: 33.018112] [0x000007fd1d5be672] [info] Информационное сообщение о серьезности 0)

заметить, что:

  1. Конечно, с этим можно справиться (так что я думаю, что это не просто проблема обратной совместимости, а ошибка)
  2. boost 1.61 может обрабатывать битовое поле const, например BOOST_LOG_TRIVIAL(info) << "An informational severity message " << BF().b;

Я ищу обходной путь.
Предложения?

0

Решение

Самый простой обходной путь — преобразовать битовое поле в полное целое число. Вы можете сделать это с броском:

BOOST_LOG_TRIVIAL(info) << "An informational severity message "<< static_cast< unsigned int >(BF().b);
1

Другие решения

Я нашел обходной путь — оператор перегрузки<< для record_ostream всех целых чисел без знака:

#include <sys/types.h>

namespace logging = boost::log;

typedef logging::basic_formatting_ostream<  logging::record_ostream::char_type > formatting_ostream_type;

logging::record_ostream& operator << (logging::record_ostream& strm, u_int8_t value) {
static_cast< formatting_ostream_type& >(strm) << value;
return strm;
}

logging::record_ostream& operator << (logging::record_ostream& strm, u_int16_t value) {
static_cast< formatting_ostream_type& >(strm) << value;
return strm;
}

logging::record_ostream& operator << (logging::record_ostream& strm, u_int32_t value) {
static_cast< formatting_ostream_type& >(strm) << value;
return strm;
}

logging::record_ostream& operator << (logging::record_ostream& strm, u_int64_t value) {
static_cast< formatting_ostream_type& >(strm) << value;
return strm;
}

Целые числа были скопированы (взяты по значению), поэтому нет проблем с привязкой

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector