没有匹配的函数调用模板函数

时间:2012-02-19 17:38:15

标签: c++ templates function-calls

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

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 个答案:

答案 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;