特定のエラー、あなたをテンプレートテンプレートの引数が必要なためです:
template<template <typename> class C, typename T>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
T sum(C<T>::iterator begin, C<T>::iterator end)
しかし、標準コンテナは通常、ただ1つのテンプレート引数よりも持っている:
template < class T, class Alloc = allocator<T> > class vector
をし、正しく、このような関数を記述するためにビット非自明です。あなたは可変長テンプレート引数を使用することができ、または標準ライブラリがないようにあなたが行うことができ、そして唯一のあなたが本当に必要なだけを特化:
// <algorithm>
namespace std {
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
}
あなたのケースでは(あなたの必要性は、標準的なアルゴリズムライブラリによってカバーされていないことをふりすでに):
template <typename Iterator>
auto sum(Iterator begin, Iterator end)
-> decltype(*begin+*begin) // the type of summing two of them
{
if (begin == end) throw std::logic_error("....");
auto s = *begin;
++begin;
for (; begin != end; ++begin) {
s += *begin;
}
return s;
}
あなたの元のコードからいくつかのより多くの違いがあります。
は
- 新しいコードは(
it
)追加のイテレータを導入しないnullまたはデフォルトコンストラクタ定義された(T s = null;
)
- を負いません
- は、プリインクリメント
- を使用しています==最後
を開始するときに例外がスローされます
あなたがinit
パラメータを追加した場合、あなたはそれを作ることができ、ほぼnoexcept
:
template <typename Iterator, typename T>
T sum(Iterator begin, Iterator end, T init)
{
for (; begin!=end; ++begin)
init += *begin;
return init;
}
しかし、ほとんどの場合、init += *begin
がまだ投げることができます。
このような署名をお持ちでしたら、std::accumulate
の署名を再現したことがあります。
+1。しかし確かに 'std :: iterator_traits :: value_type s;'? –
@ Moo-Juiceありがとう、それを修正しました。私の編集が悪い – juanchopanza