2012-04-17 11 views
-1

"ポリシー"クラスのコンストラクタは2種類あります。私は、コンストラクタの1つを使用するときに、参照によってPolicyオブジェクトを渡すことができないと思われます。なぜそうではないのか分かりません。C++「非constリファレンスの無効な初期化」エラー

オーバーロードコンストラクタ:

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; 

は基本的に、コンパイラは、関数の宣言は何も取っていないし、ポリシーを返すようにあなたのバリエーションを扱うお試しください。それはpolicy変数宣言の後()を取り除く

int rand(); 
+0

ああ、もちろん、もちろん!私はそれを知っていたはずです。しかし、私はしませんでした。ありがとう。 – synaptik

+0

"最も厄介な構文解析"は、通常、 'ポリシーポリシー(Policy());'のようなものを指します。 –

+0

@CharlesBailey:これは、二番目に厄介な構文解析です。あいまいさは基本的に同じです。 – jpalecek

3

に似ています。コンパイラはこれが関数宣言であると考えます。

1

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

関連する問題