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

問題は、式がテンプレート関数の非 const 参照パラメーターにバインドできない右辺値&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 に答える