как вернуть ссылку на элемент вектора из оператора функции (x, y) - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть шаблон класса, который содержит вектор T в качестве защищенной переменной-члена.Я хочу перегрузить operator (), чтобы он возвращал ссылку на элемент вектора в строке y и столбце x.

Когда я объявляю функцию operator () как:

template <class T>
T & ArrayT<T>::operator()(unsigned int x, unsigned int y)const{
    return buffer[y*width + x];
}

, я получаю ошибку C2440: «возврат»: невозможно преобразовать из «const_Ty» в «T &»

Если я объявляю функцию оператора как:

template <class T>
const T & ArrayT<T>::operator()(unsigned int x, unsigned int y)const{
    return buffer[y*width + x];
}

, тогда мой код компилируется, но если, например, я создаю производный хранимый класс, где T - это float, а я пишу (obj - это объект производного класса с членомпеременный вектор чисел с плавающей точкой):

float f=obj(i,j); 
f=pow(f,2);

тогда ничего не происходит.Поплавок в позиции i, j внутри вектора не изменяется, поэтому предположим, что я действительно не работаю со ссылкой, потому что, если оператор () вернул ссылку, вышеприведенные строки должны изменить элемент в позиции (i, j)верно?

Я новичок в c ++, и я понимаю, что, возможно, я делаю здесь некоторые очень глупые ошибки, но, пожалуйста, любая помощь будет приветствоваться.

1 Ответ

0 голосов
/ 30 декабря 2018

Объявите оператор без const, например:

template <class T>
T & ArrayT<T>::operator()(unsigned int x, unsigned int y) {
    return buffer[y*width + x];
}

Доступ к таким элементам:

float & f = obj(i, j);

Обычно мы предоставляем оператор const (как это делал OP):

template <class T>
const T & ArrayT<T>::operator()(unsigned int x, unsigned int y) const {
    return buffer[y*width + x];
}

float f = obj(i, j);          // f is copy of current i,j value 

const float & f = obj(i, j);  // f references i,j value, i.e. we can
                              // observe future modifications
...