1

C++ でネストされたクラスについて学び始めました。ここに貼り付けた簡単なコードを試して、ネストされたクラスがどのように機能するかを確認しました。しかし、コンパイルは私が理解できないいくつかのエラーで終了します。

ファイル: check.cpp

class Outside{
    public:
        class Inside{
            private:
                int mInside;
            public:
                Inside(const int& x):mInside(x){}
        };
    private:
        Inside mOutside(20);
};

int main(void){
Outside o;
return 0;
}

コンパイル時に発生するエラーg++ -Wall -std=c++11 -o check.out check.cpp

check.cpp:12:25: error: expected parameter declarator
        Inside mOutside(20);
                        ^
check.cpp:12:25: error: expected ')'
check.cpp:12:24: note: to match this '('
        Inside mOutside(20);
                       ^

このエラーの背後にある適切な説明と、このエラーを克服する方法が必要です。

4

2 に答える 2

6

メンバーのインプレース初期化には、=またはを使用する必要があります。{}

// ...
private:
    Inside mOutside = 20;

括弧の形式があいまいになります (関数宣言と混同される可能性があります)。


Inside mOutside{20};

これによりclang++、警告がトリガーされます。

警告: プライベート フィールド 'mInside' は使用されていません [-Wunused-private-field]

コンパイラにはポイントがあります。奇妙なことは、他のフォーム ( ) で警告が欠落していることです=

于 2016-03-12T08:23:37.663 に答える
1

この方法でメンバーを初期化してみてください。

Inside mOutside = Inside(20);

はい、あなたの解決策はうまくいきました。しかし、どのように?なんで?

open-std でのベースとメンバーの初期化を参照してください。

于 2016-03-12T08:23:01.573 に答える