Компилятор выбирает не правильный конструктор

Пишу свой реализацию std::list, подсмотрел кунструтор оригинала (line 487, 529) и сделал также:

template <class T>
class List
{
    typedef T                           value_type;
    typedef size_t                      size_type;

    explicit List(size_type n, value_type const & val) : m_begin(NULL), m_end(NULL), m_size(0)
    {
        std::cout << "you" << std::endl;
    }

    template <class InputIterator>
        List(InputIterator first, InputIterator second) : m_begin(NULL), m_end(NULL), m_size(0)
    {
        std::cout << "no you" << std::endl;
    }
}

main.cpp :

int main ()
{
    ft::List<int> first (3,100);
    return 0;
}

Ожидаю вывод "you" Но выводится "no you"

Почему так происходит и как исправить?

UPD: Ожидаю что конструктор будет работать как у std::list lst(3, 100);


Ответы (1 шт):

Автор решения: Harry

Ну, если исправить простые ошибки в вашем коде, чтоб он компилировался, то достаточно написать

List<int> first (3u,100);

Все просто. Вы передаете 2 значения int. Для второго конструктора не требуется никаких неявных приведений, один и тот же тип InputIterator... а во втором - первый параметр - unsigned, так что требуется приведение. Так что выбран будет второй конструктор.

А когда мы дает аргументы правильных типов - дело другое, теперь приведение требуется во втором конструкторе...

Если вы хотите как контрпример привести стандартный list, так у него версия с итераторами проверяет, что это и в самом деле итераторы - например, в VC++:

template<class _Iter,
    class = enable_if_t<_Is_iterator_v<_Iter>>>
    list(_Iter _First, _Iter _Last)

Поэтому для двух int'ов выбирать - как это делается у вас - не из чего...

→ Ссылка