Рассмотрим следующие объявления std :: vector (взятые из cplusplus - EASTL имеет те же объявления)
iterator insert ( iterator position, const T& x );
void insert ( iterator position, size_type n, const T& x );
template <class InputIterator>
void insert ( iterator position, InputIterator first, InputIterator last );
Если я наберу
someVector.insert(someVector.begin(), 10, 90);
, как это не запутанный (компилятором) с последней перегрузкой, где 10
и 90
- это int
s, а тип InputIterator
принимается как int
вместо альтернативы, которая должна принимать 10
как size_type
и 20
как const int &
?
Теперь я говорю «не» , потому что я реализую векторный контейнер (в целях обучения), и в моем случае с вышеупомянутым вызовом третья перегрузка выбирается компилятором, а не вторая перегрузка и, следовательно, не компилируется. Если я удалю третью перегрузку, все будет в порядке.
Имеет ли это какое-то отношение к тому, что вызывает последняя перегрузка (перегруженные функции с чертами итератора)? Если Итак, если бы я предположил, что все итераторы являются необработанными указателями (хотя в моем случае я использую то же объявление, это означает, что у меня есть перегрузка # 3 с шаблоном, который ожидает итератор ... хотя ожидает - это неправильное слово здесь, потому что в конечном итоге это может быть что угодно, и в этом случае он интерпретируется для меня как int
и не компилируется) как я могу убедиться, что компилятор выбрал правильную функцию?