Примите во внимание следующий код.
#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).