2017-02-14 2 views
1

マイcodeこの列挙体をCTORに渡すのが間違っていますか?

#include <iostream> 

enum EnvelopeMultiPointsType { 
    ENVELOPE_MULTI_POINTS_TYPE_NORMAL = 0, 
    ENVELOPE_MULTI_POINTS_TYPE_KICK_PITCH, 
    kNumEnvelopeMultiPointsTypes 
}; 

class EnvelopeMultiPoints 
{ 
public: 
    EnvelopeMultiPoints(EnvelopeMultiPointsType type) : mType(type) { 
     std::cout << mType << std::endl; 
    } 
    ~EnvelopeMultiPoints() { }; 

private: 
    EnvelopeMultiPointsType mType; 
}; 

class Test 
{ 
public: 
    Test() { }; 
    ~Test() { }; 

private: 
    EnvelopeMultiPoints mEnv(EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL); 
}; 

int main() 
{ 
    Test test; 
} 

私がその列挙型を持つクラスを初期化することができないようです。理由は分かりません。私はここで何が欠けていますか?

オンラインコンパイラでは、は 'EnvelopeMultiPointsType'に 'ENVELOPE_MULTI_POINTS_TYPE_NORMAL'という名前の型がありませんが、上記のとおりです。

+0

これは、引数としてenum値を使用しているためです。これは、関数宣言として 'EnvelopeMultiPoints mEnv(0);'を書くのと同じです。代わりに、 'EnvelopeMultiPoints mEnv(EnvelopeMultiPointsType a_type);'を使用してください。 –

答えて

2

をあなたがやりたいようにメンバ変数をインラインで初期化するとき、あなたはブレースまたは同等初期化を使用する必要があります。

I.e.どちらか

// Use braces 
EnvelopeMultiPoints mEnv{EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL}; 

それとも

// Use equal 
EnvelopeMultiPoints mEnv = EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL; 

それはthe most vexing parseのあいまいさを防ぐための方法です。

読み取り詳細については、this member initialization referenceを参照してください。

5

このライン

EnvelopeMultiPoints mEnv(EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL); 

EnvelopeMultiPointsを返し、単一の名前を引数として、存在しないEnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMALタイプの1つの変数を取る関数mEnvの宣言として解析されます。

代わりにこのようなあなたの変数を初期化します。

EnvelopeMultiPoints mEnv = EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL; 
関連する問題