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