exponenta event banner

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