C++ 非常量调用常量成员函数失败,只读位置为C++;

C++ 非常量调用常量成员函数失败,只读位置为C++;,c++,constants,C++,Constants,接下来,我实现了一个访问器,如 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> cl

接下来,我实现了一个访问器,如

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

这是遗传的问题,但我不知道是什么或为什么。顺便说一句,如果我对上面的内部强制转换使用静态强制转换或常量强制转换,这有关系吗?

在派生类中声明的
运算符[]
隐藏了基类中的运算符。因此在中找不到
qv::operator[]

(强调矿山)

名称查找按如下所述检查作用域,直到找到至少一个任何类型的声明,,此时查找停止,不再检查其他作用域

您可以使用qv::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];
};
模板类qq:公共qv{
公众:
使用qv::运算符[];
常量T&运算符[](int i)常量重写{返回此->数据[i];}
受保护的:
T数据[5];
};

顺便说一句:我想把
qv::operator[]
声明为
private

f
a
const
对象是一个输入错误?然后将始终调用
const
qualified
get
函数。请创建一个显示给我们看。有趣。用const版本显式重写来隐藏非const版本的特性看起来相当愚蠢。不知道谁会想要那个。哦,好吧。@user2183336它和任何其他隐藏都没有什么不同。派生类中引入的单个名称隐藏基类中的所有名称,但引入的名称除外。@user2183336名称查找规则就是这样工作的。答案已编辑。
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];
};