0

我编写的模板函数具有以下签名:

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

我做错了什么?

4

1 回答 1

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;
于 2012-02-19T17:40:44.707 回答