Как перегрузить оператор косвенного обращения? (C++)

Я пытаюсь создать класс итератора как класс-член для класса списка и пытаюсь перегрузить оператор косвенного обращения (*) для доступа к списку, на который он указывает:

template<class T>
T list<T>::iterator::operator*(iterator& iter)
{
    return ((iter.lstptr)->current)->data;
}

где lstptr это указатель на список, current указатель на класс узла, а класс узла содержит элемент данных data типа T,

Итератор объявлен так:

template<class T>
class list
{
public:
class iterator;
};

template<class T>
class list<T>::iterator
{
//stuff
};

Я могу скомпилировать определение функции перегруженного оператора * отлично, но когда я пытаюсь сделать что-то вроде:

list<int> lst1;
lst1.add(6);
list<int>::iterator IT;
IT = lst1;
//everything above this point compiles fine
int a = *IT; //error here (line fourteen)

Ошибка, которую я получаю, говорит <1>, что я использую недопустимое косвенное указание, и <2>, что он не может конвертировать из list::iterator в int. Обе ошибки происходят в четырнадцатой строке.

Кто-нибудь знает, что я делаю неправильно и как правильно перегрузить оператор косвенного обращения?

NB: Если вам нужно увидеть больше кода, скажите мне, какую часть, потому что я не хочу помещать весь этот код здесь, потому что он содержит около 205 строк, и 204 из этих строк (я думаю) не имеют каких-либо ошибок.

2 ответа

Решение

Вы перегружены оператором умножения. Выньте параметр, чтобы сделать его оператором косвенного обращения.

template<class T>
T list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}

Вы также должны сделать так, чтобы он возвращал ссылку, если вы хотите такой код *IT = 3; Скомпилировать.

template<class T>
T& list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}

У вас есть две проблемы здесь; во-первых, вы случайно перегрузили оператор умножения, а не оператор разыменования; во-вторых, вы не вернули ссылочный тип.

Первая проблема возникает в результате количества параметров. Каждая нестатическая функция-член класса имеет дополнительный "скрытый" параметр: this, this конечно же, указатель на объект, для которого вызывается функция. В результате вы фактически объявили версию оператора, принимающую два параметра. Удаляя второй параметр итератора и работая на thisунар * а не бинарный.

Вторая проблема - второстепенная проблема типа возврата; вы возвращаете копию оригинальному объекту, а не сам оригинальный объект. Объявите тип возвращаемого значения как T& вернуть ссылку.

Другие вопросы по тегам