BCB6 имеет две библиотеки STL - STLPort и RogueWave. STLPort используется по умолчанию, RogueWave предоставляется для обратной совместимости с предыдущими версиями BCB.
Ваш код пытается вызвать функцию STL std::remove()
из заголовка <algorithm>
STLPort (он определен в <stl/_algo.h>
):
template <class _ForwardIter, class _Tp>
_STLP_INLINE_LOOP _ForwardIter
remove(_ForwardIter __first, _ForwardIter __last, const _Tp& __value)
Однако библиотека времени выполнения C имеет собственную функцию с одним параметром remove()
в заголовке <stdio.h>
:
int _RTLENTRY _EXPFUNC remove(const char * __path);
Эта функция C заносится в пространство имен std
в C ++ с помощью заголовка <cstdio>
, который включает в себя заголовок <algorithm>
STLPort. Есть даже комментарий о remove()
в точке, где <algorithm>
включает <cstdio>
до <stl/_algo.h>
:
# if ! defined (_STLP_USE_NAMESPACES)
// remove() conflicts, <cstdio> should always go first
# include <cstdio>
# endif
# ifndef _STLP_INTERNAL_ALGO_H
# include <stl/_algo.h>
# endif
И даже _algo.h
имеет аналогичный комментарий:
# ifdef __SUNPRO_CC
// remove() conflict
# include <cstdio>
# endif
Таким образом, STLPort всегда включает <cstdio>
перед определением собственного алгоритма remove()
, , предположительно для разрешения конфликта имен.
Но, как говорится, все ошибки, которые вы видите, связаны с тем, что компилятор думает, что вы пытаетесь вызвать 1-параметрическую функцию std::remove()
C, а не 3-параметрическую std::remove()
функцию STL. Почему компилятор так думает, я не знаю. Вероятно, это ошибка компилятора в том, как BCB6 разрешает перегрузки.
Однако проблема касается только STLPort, а не RogueWave, поскольку заголовок <algorithm>
в RogeWave не приводит к включению <cstdio>
(на самом деле, RogueWave даже не пытается обойти любой конфликт имен с remove()
между C и STL, как это делает STLPort).
Итак, одним из решений является включение использования RogueWave вместо STLPort путем определения _USE_OLD_RW_STL
перед любым из заголовков STL:
#define _USE_OLD_RW_STL
// alternatively, add `_USE_OLD_RW_STL` to the Conditionals
// list in the Project Options...
#include <vector>
#include <iostream>
#include <algorithm>
...
std::vector< int > Selection;
std::remove( Selection.begin(), Selection.end(), 10 ); // WORKS
В противном случае, если вы хотите использовать STLPort, вы можете использовать предложение, упомянутое Камилом Цуком в комментариях:
#include <vector>
#define remove _mask_remove
#include <iostream>
#undef remove
#include <algorithm>
...
std::vector< int > Selection;
std::remove( Selection.begin(), Selection.end(), 10 ); // WORKS
Или используйте ответ , предложенный StoryTeller :
#include <vector>
#include <algorithm>
namespace resolve_std {
using std::remove;
}
#include <iostream>
...
std::vector< int > Selection;
resolve_std::remove( Selection.begin(), Selection.end(), 10 ); // WORKS
Я протестировал все эти решения в BCB6, все они работают в этом сценарии.