将迭代器作为参数传递时无匹配的函数调用

No matching function call when passing iterators as arguments

本文关键字:无匹配 函数调用 参数传递 迭代器      更新时间:2023-10-16

我想创建一个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,但是我通过迭代器,并且需要在传递迭代参数之前指定数据类型。

正如您发现的讨论所说的那样,由于未分制的上下文,模板参数T不能自动推导,因此您需要明确指定它。例如

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;