2011-08-09 71 views
0

如果我想排除下用枚舉和類型重新定義的問題++我可以使用代碼:C++枚舉redefenition和C++ 0x中

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

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

有沒有一種方法,以消除上述枚舉的包裝。我查看了C++ 0x,但沒有發現有關解決此問題的addiditional inforamtion。

+1

我可能是緩慢的,但可能有人解釋完整的當前代碼是什麼問題?命名空間不會解決這個問題嗎? – ereOn

+0

在C#中,我只能定義一個沒有任何包裝的枚舉,因爲枚舉elemetns只能像EnumName.EnumElement那樣訪問,在C++中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

命名空間看起來比結構好。但是你不知道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類型爲VertexType::Vector1訪問。

從標準的一些引號:

§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枚舉(這是類和可以有方法)有什麼關係? – ereOn