Рассмотрим следующие объявления 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
и InputIterator
, тип берется как int
вместо альтернативы, которая должна принимать 10
как size_type
и 20
как const int&
?
Теперь я говорю "нет", потому что я реализую векторный контейнер (цели обучения), и в моем случае с вышеупомянутым вызовом третья перегрузка выбирается компилятором, а не второй перегрузкой и, следовательно, не компилируется. Если я удалю третью перегрузку, тогда все будет хорошо.
Это связано с тем, что вызывает последняя перегрузка (перегруженные функции с помощью свойств итератора)? Если это так, то если я должен был предположить, что все итераторы являются исходными указателями (хотя в моем случае я использую одно и то же объявление, это означает, что у меня есть перегрузка # 3 с шаблоном, ожидающим итератор... хотя ожидается неправильное здесь, потому что в конце концов это может быть что угодно, и в этом случае он интерпретируется как int
для меня и не компилируется), как я буду уверен, что компилятор выбирает правильную функцию?