我的“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);
,那么编译器就不会抱怨。请帮忙! :)
答案 0 :(得分:5)
Policy policy(); // Does not work
那是most vexing parse。尝试
Policy policy;
基本上,编译器会将您的变体视为函数的声明,并且不会返回策略。它类似于
int rand();
答案 1 :(得分:3)
在()
变量声明后删除policy
。编译器认为这是一个函数声明。
答案 2 :(得分:1)
正如您从错误输出中看到的那样,Policy policy()
会创建一个函数,然后您尝试将其发送到sampleMIXD
。用Policy policy;
构造它(即省略()
)。