Перегрузка оператора постинкремента C++ в итераторах (компиляция с -Wall -Werror)

В настоящее время я создаю свой собственный итератор для b-дерева, и я застрял в том, как реализовать оператор постинкремента без жалоб компилятора.

Сообщение об ошибке выглядит следующим образом и ожидается (поскольку я делаю именно то, что говорится в сообщении об ошибке)

cc1plus: warnings being treated as errors
error: reference to local variable 'temp' returned

Мне нужно написать функцию с тегами -Wall и -Werror, поэтому, надеюсь, кто-то сможет помочь мне с решением этой проблемы.

Вот функция:

template <typename T> btree_iterator<T>& btree_iterator<T>::operator++(int) {

  btree_iterator<T> temp(*this);
  pointee_ = pointee_->nextNode();
  return temp;
}

Я осмотрелся и смог найти только примеры людей, реализующих оператор именно так, как я на данный момент.

Всякий раз, когда у меня раньше возникала подобная проблема, я «обновлял» возвращаемый объект, чтобы он больше не был временным. Но поскольку это итератор, если я это сделаю, я не смогу впоследствии освободить память и, таким образом, возникнут утечки памяти.

Если кто-то может мне помочь, это будет очень признательно! Пожалуйста, дайте мне знать, если есть что-то еще в моем дизайне, что поможет вам понять проблему.

С Уважением.


person Mick    schedule 21.10.2011    source источник


Ответы (2)


Ошибка достаточно ясна -

error: reference to local variable 'temp' returned

В вашей функции вы возвращаете ссылку на temp, который является временным объектом.

Возможно, вам нужно вернуть копию (поскольку вы не хотите использовать new ). Итак, вместо

template <typename T> btree_iterator<T>& btree_iterator<T>::operator++(int) {

вам может быть нужно

// note the missing `&`...............vv
template <typename T> btree_iterator<T> btree_iterator<T>::operator++(int) {
person Kiril Kirov    schedule 21.10.2011
comment
Ах.... большое спасибо, Кирилл... теперь это так очевидно, что вы указали на это. Вы правы, даже те примеры, которые я нашел, делали именно так, просто я не заметил разницы. С Уважением! - person Mick; 21.10.2011
comment
@Mick: Компилятор изо всех сил старается помочь вам с сообщениями об ошибках, попытайтесь понять, что он вам говорит. Частью работы является понимание сообщений об ошибках, чтобы понять, что не так или, по крайней мере, как компилятор интерпретирует ваш код. - person David Rodríguez - dribeas; 21.10.2011
comment
@DavidRodríguez-dribeas Спасибо, Дэвид, определенно. Большую часть времени я могу понять, что говорит компилятор, но по какой-то причине в этом случае я, должно быть, запутался и просто не мог видеть дальше очевидного. Я на самом деле очень смущен этим :-) - person Mick; 21.10.2011

Вы возвращаете ссылку на временную переменную. Измените свою декларацию как:

template <typename T> btree_iterator<T> btree_iterator<T>::operator++(int);
person Tio Pepe    schedule 21.10.2011