我写的模板函数有以下签名:
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
”
我做错了什么?
答案 0 :(得分:1)
问题是表达式&integers[0]
返回 rvalue ,它不能绑定到average
模板函数的非const引用参数。
因此,解决方案是使参数不参考(删除&
):
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;