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