Как вставить элементы в std :: map без нарушения MISRA C ++ 2008 Обязательное правило 5-2-12?

Я получаю эту ошибку в PC-Lint (au-misra-cpp.lnt):

ошибка 1960: (Примечание — нарушает MISRA C ++ 2008, требуется правило 5-2-12,
Тип массива, переданный функции, ожидающей указатель)

По этому коду:

_IDs["key"] = "value";

_IDs объявлен как:

std::map<std::string,std::string> _IDs;

также попытался изменить на:

_IDs.insert("key","value");

Но получите ту же ошибку.

Как я могу получить код, который будет соответствовать misra?

1

Решение

Нарушенное правило зовет std::string::string(const CharT* s,
const Allocator& alloc = Allocator())
, который будет разлагаться от char const [] на указатель на символ

Решение, я думаю, заключается в явном приведении к типу указателя:

_IDs[static_cast<char const *>("key")] = static_cast<char const *>("value");

Тем не менее, я бы предложил не использовать (или, по крайней мере, обновлять) линтер, который предупреждает, когда вы действительно используете std::string,

Также обратите внимание, что вы не можете позвонить std::map::insert как вы пытаетесь это сделать. Нет перегрузки, которая принимает ключ и значение напрямую, вместо этого есть перегрузка, которая принимает пару, состоящую из ключа и значения. Увидеть Вот перегрузка № 1.

6

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

// a template function that takes an array of char
//  and returns a std::string constructed from it
//
// This function safely 'converts' the array to a pointer
//  to it's first element, just like the compiler would
//  normally do, but this should avoid diagnostic messages
//  from very restrictive lint settings that don't approve
//  of passing arrays to functions that expect pointers.
template <typename T, size_t N>
std::string str( T (&arr)[N])
{
return std::string(&arr[0]);
}

Используя вышеупомянутую функцию шаблона, вы должны быть в состоянии обойти линтера следующим образом:

_IDs[str("key")] = str("value");

Как в стороне — я удивлен, что Линт не жалуется, что _IDs это зарезервированное имя — вам следует избегать начальных подчеркиваний в C или C ++, особенно при использовании вместе с заглавными буквами.

3

По вопросам рекламы [email protected]