C ++“非const引用的初始化无效”错误

时间:2012-04-17 20:50:41

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

我的“Policy”类有两个不同版本的构造函数。在使用其中一个构造函数时,我似乎无法通过引用传递Policy对象,我不明白为什么不这样做。

重载的构造函数:

Policy::Policy(int testing) { 
    initAge=160;    
    initState=1;    

    reset();        

    x[0]=4;
    x[1]=2;
    ub[0]=10;
    ub[1]=10;
    lb[0]=0;
    lb[1]=0;

}

Policy::Policy() {
    initAge=160;
    initState=1;

    reset();    

    x[FRQ]=4;
    x[BEG]=40*4;
    x[END]=75*4;
    for(int i=0; i<240; i++)
        x[2+i]=4.0;
    x[GS]=2;

    lb[0]=1;
    ub[0]=80;
    for(int i=1;i<3;i++) {
        lb[i]=160;
        ub[i]=400;
    }
    for(int i=3;i<243;i++) {
        lb[i]=1;
        ub[i]=16;
    }
    lb[243]=2;
    ub[243]=4;

} 

这是我提供错误的代码。

void sampleMIXD(Constraints& space, Policy& p);

int main(int argc, char** argv) {

//  Policy policy(1); // Works
    Policy policy(); // Does not work

    Constraints space(2);

    sampleMIXD(space, policy);

    return 0;
}

错误讯息:

'../main.cpp:64: error: invalid initialization of non-const reference of type 'Policy' from a temporary of type 'Policy (*)()'
../MIXD.h:12: error: in passing argument 2 of 'void sampleMIXD(Constraints&, Policy&)'

如果我用Policy policy();编译而不是Policy policy(1);,那么编译器就不会抱怨。请帮忙! :)

3 个答案:

答案 0 :(得分:5)

Policy policy(); // Does not work

那是most vexing parse。尝试

Policy policy;

基本上,编译器会将您的变体视为函数的声明,并且不会返回策略。它类似于

int rand();

答案 1 :(得分:3)

()变量声明后删除policy。编译器认为这是一个函数声明。

答案 2 :(得分:1)

正如您从错误输出中看到的那样,Policy policy()会创建一个函数,然后您尝试将其发送到sampleMIXD。用Policy policy;构造它(即省略())。