【问题标题】:Subscript Operator Overloading Error下标运算符重载错误
【发布时间】:2012-03-07 00:36:38
【问题描述】:

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

提前致谢!

【问题讨论】:

  • @Beta:那么list[i] = 42 将无法按预期工作。

标签: c++ overloading operator-keyword subscript


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      按照总体思路,您可能需要考虑提供对列表的随机访问操作。它可能会让人误以为它是便宜。例如,用户可能会尝试遍历列表,例如:

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

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

      【讨论】:

        【解决方案4】:

        (您应该知道,只需使用 std::list... 不提供此操作出于某种原因...)

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

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

        因此,getValue 也需要返回 int&amp;,正如 Philipp 建议的那样。

        【讨论】:

          猜你喜欢
          • 2014-04-19
          • 2011-12-21
          • 1970-01-01
          • 1970-01-01
          • 2013-11-14
          • 2016-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多