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