下标运算符重载错误

Subscript Operator Overloading Error

本文关键字:错误 重载 运算符 下标      更新时间:2023-10-16

这是我的双链表类中的一个函数,但每次编译时,我都会收到这样的消息:"从'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
} 

提前感谢!

简单答案:getValue也必须返回一个int&

如果您想使用它来修改存储在列表中的值,那么它必须返回对该值的引用。这意味着您需要使Node::getValue()返回一个引用,或者添加另一种方法来获得对存储在节点中的值的引用。

如果您不想使用它来修改列表内容,那么您可以将返回类型更改为int

问题是无法将非常量引用绑定到右值(在本例中为getValue()函数返回的临时值)。如果要提供对存储在列表中的值的引用,以便调用方可以对其进行修改,则需要修改getValue()以返回引用。

一般来说,您可能需要考虑为列表提供一个随机访问操作。它可能会给人一种错误的想法,认为它是一个便宜。例如,用户可能会尝试迭代列表,如:

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

但迭代实际上是O(N^2),而不是O(N)

(您应该,您知道,只使用std::list…它不提供此操作是有原因的…)

返回int&的原因是,编写mylist[i] = 42的人实际上会修改列表的内容。

但是,通过使用getValue帮助程序可以获得该值,该帮助程序根据错误消息返回一个副本。编译器通过分析数据类型发现了您的逻辑错误。如果希望能够修改实际列表数据,则必须返回对实际列表数据的引用,而不是副本。

因此,正如Philipp所建议的,getValue也需要返回int&