2016-07-28 22 views
0

内部列挙型を参照してください:私はヘッダファイルに次のように定義された構造体を持つ構造体

struct MessageA { 
    enum Status { 
     eReady, eNotReady 
    }; 
}; 

その後、私はこの列挙を使用しようとすると:

#include <MessageA.hh> 
... 
if(status != MessageA.Status.eReady) continue; 

を私はエラーを取得します:

expected primary-expression before '.' token 
'Status' has not been declared 

私は次のことを試してみました、それが働いた:

if(status != MessageA::eReady) continue; 

しかし、使用している場合:

if(status != MessageA::Status::eReady) continue; 

は、その後、私はエラーを取得する:私は、複数の列挙があったかのように、完全に(適格な列挙型の名前を指定する必要がある場合

Status is not a class or a namespace 

内部で同じ値で)私はどのようにそれを行う必要がありますか?

+3

';' –

答えて

4

スコープ演算子を使用します

MessageA::eReady; 
+0

MessageA :: eReadyで動作します。しかし、MessageA :: Status :: eReadyは "MessageA :: Statusはクラスまたは名前空間ではありません"というエラーを返します –

+0

@TylerDurdenこの場合、プレC++ 11コンパイラを使用しています。私の答えの2番目の部分を参照してください。 –

+0

これは、pre11では、あいまいなので、同じ値を持つ別の列挙型を持つことができないことを意味しますか? –

1

入れ:以前のC++ 11枚の列挙型のラベルを使用すると、次のコードを使用することになる場合にはスコープされていないにことに注意してください。また

MessageA::Status::eReady; 

structの最後に;:そして

struct MessageA { 
    enum Status { 
     eReady, eNotReady 
    }; 
}; 

0の使用怒鳴るようなの要素:(ステータス= MessageA :: eReadyが!)続けば

int main() 
{ 
    if (MessageA::Status::eNotReady == 0) 
     printf("ok"); 

    return 0; 
} 
+0

これは質問のタイプミスです。ヘッダーファイルは正常にコンパイルされます。 –

関連する問題