Рассмотрите следующий код.
#include <list>
void f(const std::list<int*>::const_iterator it) {}
void f(const std::list<int*>::iterator it) {}
void g(const std::list<int*>::const_reverse_iterator it) {}
void g(const std::list<int*>::reverse_iterator it) {}
Заявленные функции принадлежат контейнерным классам list с различными итераторами. Однако программное обеспечение генерирует следующие ошибки компиляции:
error: function "f" has already been defined error: function "g" has already been defined
Вы также видели бы ту же ошибку, если бы вместо list заданным контейнером был vector, set, map или deque.
Чтобы избежать двойных ошибок объявления, выполнить одно из следующих действий:
Деактивируйте автоматическое блокирование функций стандартной библиотеки шаблонов. Для получения дополнительной информации смотрите No STL stubs (-no-stl-stubs).
Задайте следующие директивы предварительной обработки Polyspace®:
__PST_STL_LIST_CONST_ITERATOR_DIFFER_ITERATOR__
__PST_STL_VECTOR_CONST_ITERATOR_DIFFER_ITERATOR__
__PST_STL_SET_CONST_ITERATOR_DIFFER_ITERATOR__
__PST_STL_MAP_CONST_ITERATOR_DIFFER_ITERATOR__
__PST_STL_DEQUE_CONST_ITERATOR_DIFFER_ITERATOR__
Например, для данного кода, запустите анализ в командной строке со следующим флагом. Флаг задает соответствующую директиву для контейнера list.
-D __PST_STL_LIST_CONST_ITERATOR_DIFFER_ITERATOR__
Preprocessor definitions (-D).