模板方法实例和std :: vector.begin()作为参数的问题

时间:2015-08-24 06:54:14

标签: c++ templates vector iterator

我想创建一个重载的类operator()方法,它可以将任何类型的迭代器(包括指针)作为参数。我尝试使用模板制作它:

class SimpleFunction
{
public:
    virtual double operator()(double x) = 0;
    template<class Iterator> void operator()(Iterator x, Iterator y, unsigned int n);
    void operator()(const vector<double> &x, const vector<double> &y);
};

template<class Iterator> void SimpleFunction::operator()(Iterator x, Iterator y, unsigned int n)
{
    while (x != x + n)
        *y++ = operator()(*x++);
}

void SimpleFunction::operator()(const vector<double> &x, const vector<double> &y)
{
    operator()(x.begin(), y.begin(), x.size());
}

但是当我尝试编译我的代码时,我收到一个错误:

D:\MyFiles\functions\simple.cpp:9: error: C3892: 'y' : you cannot assign to a variable that is const

我无法理解为什么会出现此错误,因为std::vector必须有begin()方法,它返回非const迭代器。 我怎样才能避免这个错误?

1 个答案:

答案 0 :(得分:0)

std::vector有const重载beginend成员函数。因此,在模板调用operator()(x.begin(), y.begin(), x.size());中,Iterator被推断为vector<double>::const_iterator。如果您要修改传入的向量y,请不要将其作为const vector<double>&

void SimpleFunction::operator()(const vector<double> &x, vector<double> &y)

请注意,如果您坚持使用不同类型的xy,则需要使用两个模板类型参数而不是一个:

template<class Iterator, class IteratorY> void SimpleFunction::operator()(IteratorX x, IteratorY y, unsigned int n)