将迭代器作为参数

时间:2017-02-27 05:37:44

标签: c++ templates stl iterator containers

我想创建一个Sum()函数来计算STL容器的总和。该函数使用模板参数作为迭代器类型,并接受两个迭代器作为参数,如下所示:

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;
}

并在main()中调用函数:

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但我传递了迭代器,我需要在传递迭代器参数之前指定数据类型。

1 个答案:

答案 0 :(得分:0)

正如您发现的讨论所述,模板参数T由于non-deduced contexts而无法自动推断,因此您需要明确指定它。 e.g。

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;