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
aconst
对象是一个输入错误?然后将始终调用const
qualifiedget
函数。请创建一个显示给我们看。有趣。用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];
};