gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:34 25 4
gpt4 key购买 nike

正在关注 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];
};

但是在尝试做类似的事情时得到一个只读位置的分配:

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

这是导致问题的继承问题,但我不知道是什么原因。顺便说一句,如果我对上面的内部转换使用 static 或 const_cast 有关系吗?

最佳答案

operator[]在派生类中声明隐藏基类中的那个。所以qv<T>::operator[]name lookup 中找不到.

(强调我的)

name lookup examines the scopes as described below, until it finds at least one declaration of any kind, at which time the lookup stops and no further scopes are examined.

您可以添加 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];
};

顺便说一句:我想声明 qv<T>::operator[] 是个错字作为private .

关于c++ - 非常量调用 const 成员函数失败,只读位置 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50244722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com