Нет соответствующего вызова функции для шаблонной функции - PullRequest
0 голосов
/ 19 февраля 2012

Написанная мной функция шаблона имеет следующую подпись:

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 Ответ

1 голос
/ 19 февраля 2012

Проблема в том, что выражение &integers[0] возвращает rvalue , которое нельзя привязать к неконстантным ссылочным параметрам 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;
...