【问题标题】:Receiving a value-of-reference error when passing around variables using pass-by-reference使用 pass-by-reference 传递变量时收到 value-of-reference 错误
【发布时间】:2018-08-12 15:59:30
【问题描述】:
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;

const int OPERAND_RANGE = 100;

void doOneProblem(char &op);
void doOneSet(char &op);
void generateOperands(int &num1, int &num2);
void calculateAnswer(int &num1, int &num2, int &answer, char &op);
void checkAnswer(int num1, int num2, int &answer, int &userAnswer, char &op);

int main() {

    srand(static_cast<unsigned>(time(0)));
    doOneSet('+');

}

void generateOperands(int &num1, int &num2) {

    num1 = rand() % (OPERAND_RANGE + 1);
    num2 = rand() % (OPERAND_RANGE + 1);

}

void calculateAnswer(int &num1, int &num2, int &answer, int &userAnswer, char &op) {

    if (op == '+') {
        answer = num1 + num2;
    } else if (op == '-') {
        answer = num1 - num2;
    } else if (op == '*') {
        answer = num1 * num2;
    } else if (op == '/') {
        answer = num1 / num2;
    } else {
        cout << "Not an accepted operator.";
    }

}

void doOneProblem(char &op) {

    int num1, num2, answer, userAnswer;
    char op;

    generateOperands(num1, num2);
    calculateAnswer(num1, num2, answer, userAnswer, op);
    checkAnswer(num1, num2, answer, userAnswer, op);


}

void checkAnswer(int num1, int num2, int &answer, int &userAnswer, char &op) {

    cout << "What is " << num1 << " " << op << " " << num2 << "?: " << endl;
    cin >> userAnswer;

    if (userAnswer == answer) {
        cout << "Correct!" << endl;
    } else {
        cout << "Incorrect" << endl;
    }


}

void doOneSet(char &op) {

    for (int i = 0; i < 5; i++) {

        doOneProblem(op);

    }


}

大家好,我正在练习使用传递引用变量。当我在 main 中调用函数 doOneSet 时,出现错误:

initial value of reference to non-const must be an lvalue

我的目标是将操作符 (op) 变量从 doOneSet 一直传递回 calculateAnswer() 函数,该函数应根据输入的字符确定答案。

错误信息:

a7_1.cpp:18:5: error: no matching function for
      call to 'doOneSet'
    doOneSet('+');
    ^~~~~~~~
a7_1.cpp:10:6: note: candidate function not
      viable: expects an l-value for 1st
      argument
void doOneSet(char &op);
     ^
1 error generated.

【问题讨论】:

  • 为方便起见,请在发生错误的行中添加。
  • '+'const char,而不是 char。注意您的方法doOneProblem(char &amp;op) 还声明了一个本地char op 变量。删除它。

标签: c++ constants pass-by-reference


【解决方案1】:

当你这样做时:

doOneSet('+');

关于这个功能:

void doOneProblem(char &op);

您正在对rvalue 进行非常量引用。编译器怎么知道在那个函数中你不会这样做:

op = 10;

如果你这样做了,会发生什么?右值操作在哪里存在,你会改变什么?解决方法是正确指定函数的原型。对于这种情况,它应该是:

 void doOneProblem(char op);

【讨论】:

  • 谢谢你。但是,当我修复该功能时,我仍然遇到同样的错误。我会将错误消息添加到帖子中。编辑:修复它。我将 doOneSet 中的变量设为按值传递。不知道为什么会这样,但确实有效。
  • @JulianL 当你修复函数时如何?您需要设置参数const char &amp;op,并且在它出现的所有其他函数中都相同。但是为什么你要通过引用传递原语是一个谜。唯一需要引用的是answer,您可以随时将其设为返回值。
  • @EJP 我很想使用返回值。这会容易得多。但是,这是针对我的 CS 课的,我们的教授正在尝试教我们如何使用 pass-by-reference,因此不允许返回值。
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 2012-03-04
  • 2015-10-22
  • 1970-01-01
  • 2015-04-08
  • 2022-02-24
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多