Ошибки из двойных объявлений функций библиотеки стандартных шаблонов (C++)

Примите во внимание следующий код.

#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).