在这篇文章后,我实现了一个类似的访问器
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];
};
Run Code Online (Sandbox Code Playgroud)
但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
}
Run Code Online (Sandbox Code Playgroud)
这是导致问题的继承,但我不知道是什么或为什么.顺便说一下,如果我使用静态或const_cast作为上面的内部演员是否重要?
的operator[]派生类声明隐藏所述一个中的基类.所以qv<T>::operator[]在名字查找中找不到.
(强调我的)
名称查找检查范围如下所述,直到它找到至少一个任何类型的声明,此时查找停止并且不再检查其他范围.
您可以添加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];
};
Run Code Online (Sandbox Code Playgroud)
BTW:我想,这是申报一个错字qv<T>::operator[]的private.