【发布时间】:2020-07-17 08:54:19
【问题描述】:
我尝试从 const 方法返回一对向量迭代器。
pair<vector<double>::iterator, vector<double>::iterator> Matrix::GetColumn(int j) const {
return pair<vector<double>::iterator, vector<double>::iterator>(values_.begin() + j * height_,
values_.begin() + (j + 1) * height_);
}
我在编译时收到以下错误
matrix.cc:119:133: error: no matching function for call to ‘std::pair<__gnu_cxx::__normal_iterator<double*, std::vector<double> >, __gnu_cxx::__normal_iterator<double*, std::vector<double> > >::pair(__gnu_cxx::__normal_iterator<const double*, std::vector<double> >, __gnu_cxx::__normal_iterator<const double*, std::vector<double> >)’
return pair<vector<double>::iterator, vector<double>::iterator>(values_.begin() + j * height_, values_.begin() + (j + 1) * height_);
^
迭代器是指向vector<double> 开头和结尾的指针,允许用户编辑向量中的值。 AFAIK 这不超出const 的范围吗?
这个类看起来像这样:
class Matrix {
int height_;
int width_;
vector<double> values_;
}
当我删除 const 时,错误消失了。
【问题讨论】:
-
成员是
const在const方法中,因此values_.begin()返回const_iterator,而不是iterator。 -
感谢您的回答@mch。另一个问题: const 方法总是返回 const 值吗?我知道这个方法不应该改变
this,但是调用者呢? -
@matthiasbe 不,但是在这样的函数中访问成员是
const,并且“const”向量不能公开iterator,只能公开const_iterator。所以这不是一般规则,但你会经常遇到这种模式。这确实是为了保护对象不仅不受函数本身的影响,而且不受调用者的影响。 -
@mch 请不要在 cmets 中回答