Перегрузка оператора C ++ после приращения в итераторах (компиляция с -Wall -Werror) - PullRequest
3 голосов
/ 21 октября 2011

В настоящее время я создаю свой собственный итератор для 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;
}

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

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

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

Привет.

Ответы [ 2 ]

6 голосов
/ 21 октября 2011

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

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) {
3 голосов
/ 21 октября 2011

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

template <typename T> btree_iterator<T> btree_iterator<T>::operator++(int);
...