2017-02-27 3 views
0

STLコンテナの合計を計算するSum()関数を作成したいとします。関数は、イテレータ型のテンプレート引数を使用し、以下のように引数として2回の反復子を受け入れ:イテレータを引数として渡すときに関数呼び出しが一致しない

template <typename T> 
double Sum(typename T::const_iterator start, typename T::const_iterator end) 
{ 
    typename T::const_iterator i3; 
    double sum2=0.0; 
    for (i3=start; i3 != end; ++i3) 
    { 
     sum2 += (i3); 
    } 
    return sum2; 
} 

と(メインで)私はのような関数を呼び出す:

vector<double>::const_iterator vec_start=myvector.begin(); 
vector<double>::const_iterator vec_end=myvector.end(); 
cout<<"The sum of the vector is "<<Sum(vec_start, vec_end)<<endl; 

しかし、それは無いと言っていますSum()に一致する関数呼び出し。関数のシグネチャがTなので、イテレータを渡し、イテレータのパラメータを渡す前にデータ型を指定する必要があるため、いくつかの議論を読んでいます。

+0

std :: accumulateには何らかの理由がありますか? – Skym0sh0

+0

コンテナイテレータを実践するだけの宿題はありません。 –

答えて

0

テンプレートのパラメータTは、non-deduced contextsのため自動的に推測できないため、明示的に指定する必要があります。例えば

cout << "The sum of the vector is " << Sum<vector<double>>(vec_start, vec_end) << endl; 
//          ~~~~~~~~~~~~~~~~ 

しかし、あなたが実際には、あなたがSumの宣言を変更することができることを行う必要はありません。

template <typename I> 
double Sum(I start, I end) 
{ 
    I i3; 
    double sum2=0.0; 
    for (i3=start; i3 != end; ++i3) 
    { 
     sum2 += *i3; 
    } 
    return sum2; 
} 

Iは、それが

として、元々それを使用していいのよ、その後推定することができます
cout << "The sum of the vector is " << Sum(vec_start, vec_end) << endl; 
+0

返信いただきありがとうございます!私は今、論理を参照してください:) –

+1

あなたは '(i3)'の代わりに '* i3'を意味しませんか?イテレータは、通常、参照される値を取得するために参照解除されます。 –

+0

はい、タイプミスです。それを指摘してくれてありがとう –

関連する問題