【问题标题】:lvalue required as left operand of assignment (incrementing a referenced variable) C++左值需要作为赋值的左操作数(递增引用的变量)C++
【发布时间】:2018-08-01 23:07:55
【问题描述】:

假设我在 main 中有一个变量,我们称之为 var。 我有一个函数,我希望能够在其中增加 var。

function (int &var)
{
    //Body
    &var += 1;
}

我得到错误:

需要左值作为赋值的左操作数。 我该如何解决这个问题?

编辑:

//In header file:
void addActivities(struct activity activityEntry[], int &activityIndex, int 
&activityList);

//In Main:
struct activity activityEntry[LIST_SIZE];
int activityIndex = 0;
int activityList = 0;
//unrelated code...
case 1: addActivities(&activityEntry[activityIndex], activityIndex, 
activityList);

//In actual function:
void addActivities(struct activity activityEntry[], int *activityIndex, int 
&activityList)
{
    //unrelated code...
    activityList += 1;
}

然后报错:

Program3Main.cpp:(.text+0x12b): undefined reference to `addActivities(activity*, int&, int&)' collect2:错误:ld 返回 1 个退出状态

【问题讨论】:

  • 只需使用var += 1; 我想知道我是否应该投票关闭打字错误。
  • 当我删除 & 时,它告诉我对函数(var)的未定义引用
  • 如果没有minimal reproducible example,很难提出建议。
  • 看起来addActivities() 的函数定义需要三个参数:一个结构数组、一个指向 int 的指针,然后是一个 int(作为引用)。您似乎正在向它传递一个结构数组、一个 int 和另一个 int。这是假设错误是由您直接在//unrelated code... 下方的调用引起的。
  • 当我在参数中将引用的 int 更改为 int& 时,它告诉我:从 int* 到 int 的无效转换。应该更改它的哪个部分以使其匹配? (对于引用的 int?)

标签: c++ compiler-errors pass-by-reference lvalue


【解决方案1】:

从您的函数中的var 前面删除&

function (int &var)
{
    //Body
    var += 1;
}

函数内的& 充当地址运算符,这意味着您实际上是在递增var地址,而不是它指向的值。

另一种表述方式:使用& 作为参数(就像您使用function(int &var) 所做的那样)意味着您实际上是在传递var 本身,而不是它的值。因此,当您在函数内部增加var 时,您不再需要对它的引用,因为内部函数var 与传递给function()var 相同(例如,来自main()) .

不要忘记函数的返回类型。您还可以使用递增运算符递增 var,如下所示:

#include <iostream>

void increment(int &var)
{
    var++;
}

int main() {
  int num = 0;
  increment(num);
  increment(num);
  std::cout << num << std::endl; // prints 2
}

【讨论】:

  • 没有返回类型,因为它不是一个真正的函数,为了简单起见,我只是这样做了。当我拿走 & 时,它告诉我对这个变量的未定义引用......
  • @HannahLouise 我想。只是确保。
  • @HannahLouise 你能发布给你这个错误的完整例子吗?
  • 整件事情很可怕,但我试图发布相关的部分
猜你喜欢
  • 2011-09-03
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多