非const调用const成员函数失败,只读位置C++

use*_*336 4 c++ const

这篇文章后,我实现了一个类似的访问器

template<class T> class qv {
  virtual const T& operator[](int i) const = 0;
  T& operator[](int i) { return const_cast<T&>(static_cast<const qv*>(this)->operator[](i)); }
};
template<class T> class qq : public qv<T> {
 public:
  const T& operator[](int i) const override { return this->data[i]; }
 protected:
  T data[5];
};
Run Code Online (Sandbox Code Playgroud)

assignment of read-only location在尝试做类似的事情时得到一个:

int main(int argc, char** argv) {
  qq<int> q;
  q[3] = 2; // read-only location compile error, g++ 6.3
}
Run Code Online (Sandbox Code Playgroud)

这是导致问题的继承,但我不知道是什么或为什么.顺便说一下,如果我使用静态或const_cast作为上面的内部演员是否重要?

son*_*yao 7

operator[]派生类声明隐藏所述一个中的基类.所以qv<T>::operator[]名字查找中找不到.

(强调我的)

名称查找检查范围如下所述,直到它找到至少一个任何类型的声明,此时查找停止并且不再检查其他范围.

您可以添加using qv<T>::operator[];以将名称operator[]引入派生类.例如

template<class T> class qq : public qv<T> {
 public:
  using qv<T>::operator[];
  const T& operator[](int i) const override { return this->data[i]; }
 protected:
  T data[5];
};
Run Code Online (Sandbox Code Playgroud)

BTW:我想,这是申报一个错字qv<T>::operator[]private.