-1

「Policy」クラスのコンストラクターには2つの異なるバージョンがあります。コンストラクターの1つを使用しているときに、参照によって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:エラー:「voidsampleMIXD(Constraints&、Policy&)」の引数2を渡す際に

Policy policy();でコンパイルする代わりにPolicy policy(1);、コンパイラは文句を言いません。助けてください!:)

4

3 に答える 3

5
Policy policy(); // Does not work

これは最も厄介な解析です。試す

Policy policy;

基本的に、コンパイラはバリアントを、何も受け取らずにポリシーを返す関数の宣言として扱います。に似ています

int rand();
于 2012-04-17T20:53:03.610 に答える
3

変数宣言の()後を削除します。policyコンパイラは、これが関数宣言であると見なします。

于 2012-04-17T20:53:29.693 に答える
1

エラー出力からわかるようにPolicy policy()、関数を作成し、それをに送信しようとしますsampleMIXD。代わりにそれを構築しPolicy policy;ます(つまり、を省略します())。

于 2012-04-17T20:54:24.513 に答える