典型的な関数テンプレートの署名:
template<typename Iterator, typename T>
T fn(Iterator first, Iterator last, T init)
{
T result;
// ...
return result;
}
問題は、次のように呼び出すときです。
std::vector<long> data(1000,1);
fn(data.begin(), data.end(), 0);
または明示的に呼び出すことなく他の方法
fn<std::vector<long>::iterator, long>(data.begin(), data.end(),0);
の場合、 T の型は でありint
、 でオーバーフローして悪い結果が生じるリスクがありfn
ます。
では、どのように特化fn
して
fn(data.begin(), data.end(), 0);
明確であり、結果は?T
に設定されます。Iterator::value_type
選択肢
template<Iterator>
typename iterator_traits<Iterator>::value_type fn(Iterator first, Iterator last, typename iterator_traits<Iterator>::value_type init)
{
//...
}
g++/clang++ からのあいまいな呼び出しエラーが発生します。
編集:
私は今私の間違いを見て、上記のコードは以下の @Lightness Races の提案で動作します。助けてくれてありがとう。