2012-02-19 13 views
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]); 

しかし、打ち鳴らすには、それはマッチング機能を見つけることができないことを私に伝えます:私は、配列の最初と最後にポインタを渡すことによって機能を呼び出す

error: no matching function for call to ' average '

は私が間違って何をしましたか?

答えて

1

問題は発現が&integers[0]averageテンプレート関数の非const参照パラメータにバインドすることができない右辺を返すことです。

だから、解決策は、パラメータが非参照(&を削除)することです。

template<class IteratorT> 
auto average(IteratorT begin, IteratorT end) -> decltype(*begin) 

そして、(それは重要ではないが、しかし、未定義の振る舞いを呼び出すために&integers[8]ようだ、pedantically話す)としてそれを呼び出します:

auto average = sigma::average(integers, integers + 8); 

なぜこのような関数テンプレートが必要ですか? std::accumulateを次のように使用することができます:

#include <algorithm> //must include this 

auto average = std::accumulate(integers, integers + 8, 0)/8; 
+0

まあ、 'average'は内部的に' std :: accumulate'と 'end-begin'でデバイスを使います。私のアプリケーションでは平均値*が多く計算されるので便利な関数です。 –

関連する問題