Я получаю эту ошибку в 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?
Нарушенное правило зовет 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.
// 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 ++, особенно при использовании вместе с заглавными буквами.