关注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作为上面的内部演员是否重要?
答案 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
是一个错字。