非const引用的初始化无效

时间:2011-11-06 21:02:56

标签: c++ visual-c++

我试图引用一个类变量,它是一个向量并更改向量的值。我收到了这个错误。我究竟做错了什么?提前致谢。 (“挑选”只是一个整数。)

 class tic
{
private:
vector<int> move;   //calculate moves
vector<int> value1; //player1's points
vector<int> value2; //player2's points
vector<int> value;  //exchange value
vector<string> board;   //numbers on the board
public:
void setboard ();   //output numbers on the board
void setvalue();    //each number's value corresponding to the numbers on the board
void setvalue12();  //values of player1 and playe2
void set(); //setboard, setvalue, setvalue12
void printboard (int &pick); //print board
int pick(int &m);       //pick a number on the board
bool sum15 (vector<int> &sum15);  //check if sum is 15 of any combination of 3
int WinLoseDraw (int &pick, int player);    //win=0, continue=1, draw=20
void WLD(int &player)
{   
    vector<int> &temp=(player==1)?this->value1:this->value2;
    temp[pick-1]=value[pick-1]; //input values
    if (sum15(temp))    //if any sum of 3 is 15
    {
        cout<<"WINS!"<<endl;
    }
}

};

这是原始代码。我试图简单地使用成员函数或名为WLD

的内联函数
    if (player==1)  
    {       
        value1[pick-1]=value[pick-1];   //input values

        if (sum15(this->value1))    //if any sum of 3 is 15
            {
                cout<<"PLAYER1 WINS!"<<endl;
                return 0;
            }
    }
    else  
    {
        value2[pick-1]=value[pick-1];

        if (sum15(this->value2))
        {
            cout<<"PLAYER2 WINS!"<<endl;
            return 0;
        }
    }

使用更新的代码。我在“temp [pick-1] = value [pick-1];

上得到了错误
tic.h: In member function ‘void tic::WLD(int&)’:
tic.h:28: error: invalid use of member (did you forget the ‘&’ ?)
tic.h:28: error: invalid use of member (did you forget the ‘&’ ?)

4 个答案:

答案 0 :(得分:2)

引用不可分配,只能构造。你可以试试:

vector<int>& temp = ( player == 1 ) ? this->value1 : this->value2;

<强>更新

使用更新的代码,您只需将const放在temp中即可使其正常运行。请注意,您有 lvalues rvalues 中的 r 不是来自引用,而是来自,就像在表达式的右侧可用。

答案 1 :(得分:0)

我认为您的错误位于vector<int> &temp=vector<int>()行。但是,由于您尝试分配&temp,然后立即在if-else语句的分支中重新分配,因此不清楚您在这里做了什么。

答案 2 :(得分:0)

无法重新分配参考,您正在声明它,然后在if中将其设置为新值。

在这种情况下,我认为你不应该尝试使用引用。

答案 3 :(得分:0)

初始化参考后,无法重新初始化或分配。

您似乎正在尝试使用the ternary (or conditional) operator

执行此操作
const vector<int>& values = (player == 1) ? value1 : value2;

你说:

  

(“pick”只是一个int。)

您的代码说:

int pick(int &m);

pick这是方法,而不是int

如果您正在使用g++进行编译,我建议您启用(至少)-Wshadow,这会在您犯此类错误时发出警告。你已经使用sum15做了同样的事情。