выбор перегруженной функции шаблона (сопоставление с образцом) работает в std :: vector insert?

Рассмотрим следующие объявления 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 и не компилируется) как я могу убедиться, что компилятор выбрал правильную функцию?

17
задан Samaursa 11 July 2011 в 19:02
поделиться