私の C++ クラス (Boost はまだカバーしていません) の演習として、STL コンテナーで数値を合計するための 2 つのイテレーターを受け入れるテンプレート化されたメソッドを作成するのに問題があります。
次の例を検討してください。
#include <iostream>
#include <iterator>
#include <vector>
template<typename T>
double Sum(const T & c) {
return 42.0; // implementation stubbed
}
// need help writing this method signature to accept two iterators
template<typename T>
double Sum(const typename T::const_iterator & begin,
const typename T::const_iterator & end) {
return 43.0; // another implementation stub
}
int main() {
std::vector<double> v;
v.push_back(3.14);
v.push_back(2.71);
v.push_back(1.61); // sums to 7.46
std::cout << Sum(v) << ' ' // line 23
<< Sum(v.begin(), v.end()) // line 24
<< '\n';
}
このコードは を出力42 43
するはずですが、コンパイルに失敗します。
g ++が私に与えるエラーは次のとおりです。
test_exercise2.cpp: In function ‘int main()’:
test_exercise2.cpp:24: error: no matching function for call to ‘Sum(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >)’
24 行目をコメントアウトすると42
、期待どおりの出力が得られます。
2番目のテンプレート化されたメソッドが存在するかどうかに関係なく同じエラーメッセージが表示されるため、何らかの理由で、24行目の呼び出しを私が書いた2番目のメソッドに解決できません。
2 つの反復子を受け入れるメソッドには、どのシグネチャが必要ですか?
私がこれに固執している理由は、 の 2 番目の要素の合計をサポートする必要があるためですstd::map<K, V>
。これには、反復子->second
を逆参照する代わりに、さらに 2 つのオーバーロードを呼び出す必要があり
ます
。template<typename K, typename V> double Sum(const std::map<K, V> & m);
とstd::map
のイテレータの受け渡しを指定する方法がわかればのメソッドが書けるような気がします。template-templates を使用するソリューションには問題ありません。std::list
std::map
編集: 問題の正確な文言 (貢献しない文を省略)。
「前の演習」のコンテナはstd::vector<double>
、std::list<double>
、std::map<std::string, double>
でした。
テンプレート引数 T を入力として受け取り、double を返す Sum() というテンプレート関数を作成します。テンプレート引数はコンテナになります。
- 実装では、最後に反復子 (T::const_iterator) を取得します。次に、コンテナー T を反復処理してすべての値を追加するループを作成します。最後に合計を返します。
- メイン プログラムで、前の演習とは異なるコンテナーに対して Sum() 関数を呼び出します。
作成された Sum() 関数は、コンテナ全体の合計を計算します。また、2 つのイテレータ間の合計を計算する Sum() 関数も作成します。次に、関数は反復子の型にテンプレート引数を使用し、開始反復子と終了反復子の 2 つの反復子を受け入れます。