下标运算符重载错误
Subscript Operator Overloading Error
这是我的双链表类中的一个函数,但每次编译时,我都会收到这样的消息:"从'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&
。
相关文章:
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 在运算符重载定义中使用成员函数(const错误)
- 重载方法的方式会在使用临时调用时生成编译器错误
- 数组索引重载错误
- C++:需要帮助了解运算符重载错误
- 在类Bat代码中,这给了我错误:重载的"Bat()"的调用是不明确的Bat(;)
- 不明确的错误重载运算符<<QdataStream 子类和个人类
- 具有相同参数的不同模板模板参数的错误重载函数
- 编译错误:重载函数的多个实例与 arument 列表匹配
- clang-libc++错误:重载解析选择了隐式删除的复制赋值运算符
- 错误:重载的调用不明确
- C++ 编译器选择输出流运算符<<的错误重载
- 分段错误重载运算符<<
- 错误:重载函数的多个实例与参数列表匹配
- 错误:重载的“max(int, int)”的调用不明确
- C++编译器选择类成员函数的错误重载
- 编译错误:重载操作符()
- 错误:重载的“bind(int(Class::*)(int,int),Class*,int,int”的调用不明确
- 未解析的外部符号错误重载操作符+模板
- 错误重载在构建"OpenSubdiv"时具有类似的转换