Вот мерзость:Как установить конструктор value_type итератора в качестве аргумента по умолчанию в функции?
template <typename BidirIt, typename OutputIt, typename T,
typename BinaryDoOp, typename BinaryUndoOp>
void sliding_window(BidirIt first, BidirIt last, OutputIt d_first,
typename std::iterator_traits<BidirIt>::difference_type length,
T init = typename std::iterator_traits<BidirIt>::value_type(),
BinaryDoOp op = std::plus<>{},
BinaryUndoOp undo = std::minus<>{})
Так что я хочу T
быть std::iterator_traits<BidirIt>::value_type
по умолчанию и по умолчанию построить объект этого типа дает ему имя init
.
После решения проблемы установки некоторых типов переменных в одной строке, я обнаружил, что компилятор не может вывести T
, вот что он точно говорит:
error: no matching function for call to 'sliding_window' sliding_window(v.begin(), v.end(), output.begin(), window_length/, 0, std::plus<>(), std::minus<>()/);
note: candidate template ignored: couldn't infer template argument 'T' void sliding_window(BidirIt first, BidirIt last, OutputIt d_first,
Мой компилятор лязг ++ - 3,9 ,
вызова код сайта:
std::vector<int> v(window_length + window_count - 1);
std::iota(v.begin(), v.end(), 0);
std::vector<int> output(window_count);
std::vector<int> correct_result{3, 6, 9, 12};
sliding_window(v.begin(), v.end(), output.begin(), window_length/*, 0, std::plus<>(), std::minus<>()*/);
Когда комментировал часть раскомментирована код работает правильно.
Из того, что я знаю о шаблонах, он должен иметь возможность выводить этот тип, так как он практически является вызовом конструктора по умолчанию, который должен давать std::iterator_traits<BidirIt>::value_type
. Есть ли у меня какое-то непонимание того, как работают аргументы по умолчанию, когда функция шаблонизирована по типу?
Вопрос: как исправить? Было бы здорово добавить к нему некоторые объяснения.
Спасибо за дополнительную информацию. Версия Jarod корректно компилируется, и я считаю, что она стандартная, поэтому можно исключить типы на rhs = это хорошая идея? – Incomputable
@ Jarod42 Спасибо за исправление. –