Ошибки от двойных объявлений функций стандартной библиотеки шаблонов (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).