Как перегрузить оператор косвенного обращения? (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&
вернуть ссылку.