Компилятор выбирает не правильный конструктор
Пишу свой реализацию 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 шт):
Ну, если исправить простые ошибки в вашем коде, чтоб он компилировался, то достаточно написать
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'ов выбирать - как это делается у вас - не из чего...