Неконстантный вызов константной функции-члена завершается неудачно с доступом только для чтения C ++ - PullRequest
0 голосов
/ 09 мая 2018

После в этом посте Я реализовал метод доступа, подобный

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
}

Это что-то с наследованием, которое вызывает проблемы, но я не знаю что или почему. Кроме того, имеет ли значение, если я использую static или const_cast для внутреннего приведения выше?

1 Ответ

0 голосов
/ 09 мая 2018

operator[], объявленный в производном классе , скрывает значение в базовом классе. Так что qv<T>::operator[] нельзя найти в поиске имени .

(акцент мой)

name lookup проверяет области, как описано ниже, пока не найдет хотя бы одно объявление любого вида, , когда поиск останавливается и дальнейшие области не проверяются .

Вы можете добавить 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...