Проблема с изменением константного массива c ++ - PullRequest
0 голосов
/ 02 октября 2010

У меня есть этот код, который пытается защитить пользователя от ошибок границ массива.

Я не понимаю, почему это скомпилируется, хотя я объявил массив константным, поэтому япредположим, чтобы получить ошибку компиляции!

большое спасибо.

/************ file: SafeAccessArray.h ********************/
template<typename T>
class SafeAccessArray
{
private:
int _len;
T * _arr;
public:
SafeAccessArray (int len=2) : _len (len), _arr (new T [len]) {}
~SafeAccessArray () { delete _arr; }
T& operator [](int i) const
{if (i < 0 || i >= _len) throw (-1);
else return _arr[i]; }
};
/************ end of file: SafeAccessArray.h *************/

/************ file: SafeAccessArray1.cpp *************/
#include "SafeAccessArray.h"
int main()`enter code here`
{
SafeAccessArray<int> intArr (2);
intArr[0] = 0;
intArr[1] = 1;
const SafeAccessArray<int> intArrConst (2); // THIS IS THE "PROBLEMATIC" LINE
intArrConst [0] = 0;
intArrConst [1] = 1;
return 0;
}
/************ end of file: SafeAccessArray1.cpp ******/

Ответы [ 2 ]

4 голосов
/ 02 октября 2010

Да, это const, но вы все равно T& operator [](int i) const. Вы возвращаете ссылку, и эту функцию можно вызывать для объекта const.

Сделай так, чтобы он вернулся const T&. Еще лучше, остановись. Просто используйте std::vector и функцию at().

2 голосов
/ 03 октября 2010

Я думаю, что operator[] функция-член желает следующих двух перегруженных вариантов:

T& operator [](int i);
const T& operator [](int i) const;

Предоставленный

T& operator [](int i) const;

не соответствует ни одному из вышеперечисленных, и, следовательно, проблема.

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