2011-08-09 20 views
0

私はC言語で列挙型と型の再定義の問題を除外したい場合は0xのが++私は、コードを使用することができますC++のenum redefenitionおよびC++

struct VertexType 
{ 
    enum 
    { 
     Vector2 = 1, 
     Vertor3 = 2, 
     Vector4 = 3, 
    }; 
}; 

struct Vector2 { ... }; 
struct Vector3 { ... }; 
struct Vector3 { ... }; 

を列挙上記のラッパーを削除する方法はあります。私はC++ 0xを見ましたが、この問題を解決するための追加情報は見つかりませんでした。

+1

私は遅くなるかもしれませんが、可能性誰かが現在のコードで問題が何かを正確に説明していますか?名前空間でこれを解決できないでしょうか? – ereOn

+0

C#では、enum elemetnsはC++でEnumName.EnumElementのようにしかアクセスできないため、C++ではラッパーのないenumを定義できます。EnumElementはグローバルスコープに属し、EnumName ::なしでアクセスできます。 – shadeglare

+0

I.e. C#で、 'EnumName'はラッパー(名前空間)です。 – MSalters

答えて

2

namespace

namespace VertexType 
{ 
    enum V 
    { 
     Vector2 = 1, 
     Vertor3 = 2, 
     Vector4 = 3, 
    }; 
} 

struct Vector2 { ... }; 
struct Vector3 { ... }; 
struct Vector4 { ... }; 
+0

名前空間がstructより見栄えがいいです。しかし、C++ 0xがenum要素のローカルスコープを追加するのは分かりませんか? – shadeglare

+3

ネームスペースは、列挙子の範囲を制限する正しい方法です。ボーナスとして、引数に依存する名前検索が行われます。 –

+0

そして、列挙型のフィールドを作成する場合は、列挙型をラップするための名前空間を使用できません。 – shadeglare

2

すでにvector3が使用されているようです。あなたは何をしようとすることができますが、vector3は使用できません。

enum //VertexType 
{ 
    Vector2 = 1, 
    //Vector3 = 2, 
    Vector4 = 3, 
}; 

struct Vector2 { ... }; 
//struct Vector3 { }; 
struct Vector3 { ... }; 

これは私にとってはまったく間違いなく動作します。

これは私が見つけたリンクです。 http://www.kixor.net/dev/vector3/

5

あなたがC++ 0xの話をしているので、ちょうど新しいenum classの構文を使用します。

enum class VertexType { 
    Vector1 = 1, 
    Vector2 = 2, 
    Vector4 = 3 
}; 

列挙値のみVertexType::Vector1のようにVertexTypeタイプを介してアクセス可能になりますが。

標準からいくつかの引用符:

§7.2/ 2 [...]列挙鍵列挙クラスと列挙型構造体は、意味的に等価です。これらのいずれかで宣言された列挙型はスコープ付き列挙型であり、その列挙子はスコープ付き列挙型です。 [...]は、

§7.2/ 10 [...]各スコープの列挙は、列挙のスコープ内で宣言されている。は、[...]は、

// example in §7.2/10 
enum class altitude { high=’h’, low=’l’ }; 
void h() { 
    altitude a;  // OK 
    a = high;   // error: high not in scope 
    a = altitude::low; // OK 
} 
+0

+1です。私は何も知りませんでした。これはJava enum(クラスでありメソッドを持つことができる)と何か関係がありますか? – ereOn

関連する問題