Ошибка перегрузки оператора нижнего индекса - PullRequest
1 голос
/ 07 марта 2012

Это функция в моем классе двусвязных списков, но каждый раз, когда я компилирую, я получаю следующее сообщение: «Неправильная инициализация неконстантной ссылки типа« int & »из временного типа« int ». Я просто могуне понимаю, как еще это сделать.

int& LinkedList::operator[](int index)
{
    Node* current = head_;

    for(int i = 0; i < index; i++){
        current = current->getNextNode();
    }

    return(current->getValue()); // getValue() returns an int
} 

Заранее спасибо!

Ответы [ 4 ]

4 голосов
/ 07 марта 2012

Простой ответ: getValue также должен возвращать int&.

2 голосов
/ 07 марта 2012

Проблема в том, что вы не можете привязать неконстантную ссылку к r-значению (в данном случае это временное значение, возвращаемое функцией getValue()). Если вы хотите предоставить ссылку на значение, хранящееся в списке, чтобы вызывающий мог изменить его, вам нужно будет изменить getValue(), чтобы он возвращал ссылку.

Что касается общей идеи, вы можете рассмотреть вопрос о предложении операции произвольного доступа к списку. Это может дать неверное представление о том, что это дешево . Пользователи могут, например, попытаться перебрать список, например:

for (int i = 0; i < list.size(); ++i)
    std::cout << list[i] << std::endl;

Но эта итерация на самом деле O (N ^ 2), а не O (N)

2 голосов
/ 07 марта 2012

Если вы хотите использовать это для изменения значения, хранящегося в списке, тогда оно должно будет возвращать ссылку на это значение.Это означает, что вам нужно либо заставить Node::getValue() вернуть ссылку, либо добавить другой способ получить ссылку на значение, хранящееся в узле.

Если вы не хотите использовать это для изменениясодержимое списка, тогда вы можете изменить тип возвращаемого значения на int.

0 голосов
/ 07 марта 2012

(Вы должны, вы знаете, просто использовать std::list ..., который не предлагает эту операцию по причине ...)

Причина, по которой вы возвращаетесь int& означает, что тот, кто пишет mylist[i] = 42, на самом деле изменит содержимое списка.

Однако вы получаете значение, используя помощник getValue, который на основании сообщения об ошибке возвращаеткопия.Компилятор, проанализировав типы данных, обнаружил вашу логическую ошибку.Если вы хотите иметь возможность изменять фактические данные списка, то вы должны возвращать ссылку на фактические данные списка, а не копию.

Таким образом, getValue также должен возвращать int&,как подсказывает Филипп.

...