我想创建一个重载的类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迭代器。
我怎样才能避免这个错误?
答案 0 :(得分:0)
std::vector
有const重载begin
和end
成员函数。因此,在模板调用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)
请注意,如果您坚持使用不同类型的x
和y
,则需要使用两个模板类型参数而不是一个:
template<class Iterator, class IteratorY> void SimpleFunction::operator()(IteratorX x, IteratorY y, unsigned int n)