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

时间:2018-05-09 02:36:19

标签: c++ const

关注this post我实现了像

这样的访问器
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];
};

但在尝试执行以下操作时获得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
}

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

1 个答案:

答案 0 :(得分:7)

派生类中声明的'&'隐藏基类中的那个。因此operator[]无法找到qv<T>::operator[]

(强调我的)

  

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

您可以添加using qv<T>::operator[];以将名称operator[]引入到派生类中。 e.g。

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];
};

BTW:我认为将qv<T>::operator[]声明为private是一个错字。