2011-12-03 15 views
1

コンストラクタを呼び出し、何もしません。コンストラクタを呼び出し、何もしません。なぜコンパイルされませんか?

基本的には、コンストラクタをオーバーロードしており、コンストラクタを変数に割り当てることなくコンストラクタを使用しています。 (通常はこれをしませんが、ファンクタを使用するときにこれが発生することがあります)

私はコピーコンストラクタをプライベートとして宣言しています。問題の原因ではなかった。)

class myClass 
{ 
    public: 
     myClass (int n, int x) { } 
     myClass (int n) { } 
    private: 
     myClass (const myClass & t){} // copy constructor is private..... 
}; 

int main() 
{ 
    int r = 5; 
    myClass A(r);  // OK (as per usual) 
    myClass (r, r); // OK 
    myClass (5);  // OK 
    myClass (r);  // not OK : error C2371: 'r' : redefinition; different basic types 

    // myClass B = myClass (r); // this would not work as copy constructor 
            // has been declared as private 
    return 0; 
} 
+5

(メイン '無効)' Cで**違法です++ **。 –

答えて

3

C++の解析規則のために、余分な括弧を使って(myClass(r));と言う必要があります。

(すでに存在する名前rの新しい変数の宣言であることを特徴とする何を。あなたもrを宣言するint(r);を言うことができることに注意してください。)

+0

レシピを与えるため+1。 –

+0

ありがとうございます。かっこが機能します。しかし、全体のステートメントを含む括弧が実際にステートメント自体の動作を変更しているのはなぜですか? (外部のウェブサイトへのリンクは大歓迎です、私はそれを見つけることができません...)多くの感謝!! – alexandreC

+0

@alexandreC:ちょうどC++文法の仕組みを読んでください。最初は宣言文、2番目は式です。それには何もない、それは単なる文法です。 –

0

myClass (r);線が実際に既にintとして定義されているタイプmyClassmyClass r;)のr変数の定義として解釈されます。

関連する問題