1

这是我的双向链表类中的一个函数,但每次编译时,我都会收到以下消息:“从‘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 回答 4

4

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

于 2012-03-07T00:50:11.727 回答
2

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

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

于 2012-03-07T00:50:03.663 回答
2

问题是您不能将非常量引用绑定到右值(在这种情况下是getValue()函数返回的临时值)。如果要提供对存储在列表中的值的引用,以便调用者可以修改它,则需要修改getValue()以返回引用。

按照一般的想法,您可能需要考虑提供对列表的随机访问操作。它可能会让人错误地认为它是廉价的。例如,用户可能会尝试遍历列表,例如:

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

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

于 2012-03-07T00:51:20.463 回答
0

(你应该,你知道,只是使用std::list......它不提供这个操作是有原因的......)

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

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

因此,正如菲利普建议的那样,也getValue需要返回。int&

于 2012-03-07T01:50:05.863 回答