Нет соответствующего вызова функции для шаблонной функции

Функция шаблона, которую я написал, имеет следующую подпись:

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;
Другие вопросы по тегам