Как перегрузить оператор косвенного обращения? (C ++) - PullRequest
9 голосов
/ 21 мая 2009

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

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 ]

14 голосов
/ 21 мая 2009

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

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;
}
7 голосов
/ 21 мая 2009

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

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

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

...