WedX - журнал о программировании и компьютерных науках

MISRA C++ 2008 странное предупреждение

Вот код ниже,

std::stringstream os;
for (size_t i = 0U; i < len; i++) {
    os << static_cast<uint32_t>(src[i]);
}

Предупреждение: «рекомендательное правило 14-8-2, Жизнеспособный набор содержит как функцию, так и шаблон: std::basic_ostream::operator‹‹»

для приведенной ниже строки кода

os << static_cast<uint32_t>(src[i]);

Пожалуйста, предложите, как решить то же самое, я новичок в С++ и уверен в том же.

c++
30.01.2014

  • Больше информации в сообщении нет? Пожалуйста, отредактируйте свой вопрос, чтобы включить полное сообщение. 30.01.2014
  • @Joachim Полное сообщение находится прямо под первым фрагментом кода. Это одно из тех глупых правил Misra, которые срабатывают, потому что basic_ostream определяет член operator<<, который представляет собой набор нешаблонных перегрузок, а также набор бесплатных версий шаблонов функций. Как сказано в предупреждении, набор кандидатов на разрешение перегрузки включает в себя оба этих шаблона — шаблоны функций и нешаблоны. 30.01.2014
  • … что является лишь одной из многих причин не использовать стандарты кодирования Misra C++. У него довольно мизерный набор правил. 30.01.2014

Ответы:


1

Предупреждение Misra срабатывает, потому что basic_ostream определяет элемент operator<<, который представляет собой набор нешаблонных перегрузок, а также набор бесплатный шаблон функции. Как сказано в предупреждении, набор кандидатов на разрешение перегрузки включает в себя оба этих шаблона — шаблоны функций и нешаблоны.

Вы можете либо подавить предупреждение для этой строки, либо найти способ не использовать operator<< для выполнения форматированного вывода. Последнее можно сделать, создав промежуточное строковое представление числа, а затем используя basic_ostream::write для вывода символов. Если у вас есть компилятор C++11, вы можете использовать std::to_string для сделай это.

auto s = std::to_string(42U);
std::stringstream ss;

ss.write(s.c_str(), s.size());

Если вы не можете использовать to_string или вам нужно дополнительное форматирование, всегда есть s(n)printf для создания строкового представления.

Мое личное мнение - подавить это предупреждение, мотивируя это тем, что вы используете хорошо определенный и хорошо известный тип из стандартной библиотеки.

30.01.2014

2

Вы используете очень общий тип: std::stringstream. Возможно это

template<class charT, class traits, class T>
basic_ostream<charT,traits>& operator<< (basic_ostream<charT,traits>&& os, const T& val);

а также

ostream& operator<< (ostream& os, ...);
30.01.2014

3

У Херба Саттера есть отличная статья о том, почему это правило имеет смысл. Это связано с особым порядком, в котором стандарт C++ обрабатывает разрешение перегрузки между шаблонными и нешаблонными функциями. Фактическая выбранная функция может не всегда соответствовать ожиданиям программиста. Вот ссылка: https://www.gotw.ca/publications/mill17.htm

Кажется, в STL есть немного опасный код.

29.06.2016
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]