【问题标题】:C++ "invalid initialization of non-const reference" errorC++“非常量引用的无效初始化”错误
【发布时间】:2012-04-17 20:50:40
【问题描述】:

我的“策略”类有两个不同版本的构造函数。使用其中一个构造函数时,我似乎无法通过引用传递 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: 错误:从'Policy (*)()' 类型的临时变量中对'Policy' 类型的非常量引用的无效初始化
../MIXD.h:12: 错误:在传递 'void sampleMIXD(Constraints&, Policy&)' 的参数 2 中

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

【问题讨论】:

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


    【解决方案1】:
    Policy policy(); // Does not work
    

    那是most vexing parse。试试

    Policy policy;
    

    基本上,编译器将您的变体视为一个函数的声明,该函数不接受任何内容并返回策略。类似于

    int rand();
    

    【讨论】:

    • 啊哈,是的,当然!我应该知道的。但我没有。谢谢。
    • “最令人头疼的解析”通常指的是Policy policy(Policy());
    • @CharlesBailey:好的,这是第二个最令人头疼的解析。歧义基本相同。
    • 就我个人而言,我认为A a();A a(A()); 更不“令人烦恼”,而A a(A()); 对我来说并不那么明显,
    • @CharlesBailey:那么我们有一系列越来越麻烦的解析A a();A a(A());A a(A(A())); 等等。在这种情况下,不可能有“最麻烦”的解析。 .
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      从错误输出中可以看出,Policy policy() 创建了一个函数,然后您尝试将其发送到 sampleMIXD。改用Policy policy; 构造它(即省略())。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-11
        • 2012-11-20
        • 2013-09-04
        • 2015-01-26
        • 2017-11-12
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多