Нет соответствующего вызова функции для шаблонной функции
Функция шаблона, которую я написал, имеет следующую подпись:
template<class IteratorT>
auto average(IteratorT& begin, IteratorT& end) -> decltype(*begin)
Я думал, что это будет работать нормально, но, видимо, это не так. Я вызываю функцию, передавая указатели на начало и конец массива:
int integers[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
auto average = sigma::average(&integers[0], &integers[8]);
Но Clang говорит мне, что он не может найти подходящую функцию:
ошибка: нет подходящей функции для вызова
average
'
Что я сделал не так?
1 ответ
Проблема в том, что выражение &integers[0]
возвращает значение, которое не может быть связано с неконстантными ссылочными параметрами average
шаблонная функция.
Таким образом, решение состоит в том, чтобы сделать параметры без ссылки (удалены &
):
template<class IteratorT>
auto average(IteratorT begin, IteratorT end) -> decltype(*begin)
Тогда назовите это как (хотя это не так важно, но &integers[8]
кажется, вызывает неопределенное поведение, педантично говоря):
auto average = sigma::average(integers, integers + 8);
Но зачем вам такой шаблон функции для начала? Вы могли бы использовать std::accumulate
как:
#include <algorithm> //must include this
auto average = std::accumulate(integers, integers + 8, 0)/8;