2011-07-01 59 views

回答

2

您不能鍵入一個枚舉。您可以使用它:

namespace B { 
    using A::ABar; 
} 

編輯

這裏被修改例如,工作原理:

namespace A { 
    enum ABar { a, b }; 

    void foo(ABar xx) {} 
} 
namespace B { 
    using A::ABar;  // 'ABar' : is injected into namespace 'B' 
    using A::a;   // 'a' : is injected into namespace 'B' 

     void foo(ABar xx) { A::foo(xx); } 
} 
int main() { 
    B::foo(B::a); 
} 

然而,隨着CygnusX1和大衛指出,上述被污染的命名空間乙,最好這樣做:

namespace A { 
    enum ABar { a, b }; 

    void foo(ABar xx) {} 
} 
namespace B { 
     void foo(A::ABar xx) { A::foo(xx); } 
} 
int main() { 
    B::foo(A::a); 
} 

還有第三個選擇,到的typedef,但是正確:

namespace B { 
    typedef A::ABar BBar; 

     void foo(BBar xx) { A::foo(xx); } 
} 

,但你仍然不能做到這一點:

B::foo(B::a); // 'a' : is not a member of 'B' 
       // 'a' : undeclared identifier 

因爲的BBar就是A :: ABAR的別名。

+0

對不起,我改變了這個例子,因此它代表了我真正的問題... – DrFroid

+0

你真的嘗試過嗎?我最初的猜測是這樣的,但這不起作用。 –

+0

問題是,我需要定義一個自己的枚舉,這反映了其他枚舉之一... – DrFroid

8

當您鍵入一個類型時,您不會導入在該名稱空間中定義的符號。所以雖然你可以寫:

int main() { 
    B::BBar enumVariable=A::a; 
} 

你不能訪問B::a,因爲這個符號不存在。

的部分外觀圖釋,在我看來,這是一種使代碼更乾淨,雖然也比較長一點寫的,是每一個枚舉裝進了自己的結構,例如:

struct ABar { 
    enum Type {a, b}; 
}; 

typedef ABar BBar; 

int main() { 
    ABar::Type var=ABar::a; 
    BBar::Type var2=BBar::a; 
} 

如果您仍然需要,您將能夠將ABar打包到命名空間中,並且通常還可以在另一個命名空間中使用typedef。

+0

我看到了這個問題..將枚舉打包到自己的類中是沒有選擇的,因爲它是一個提升枚舉;-) – DrFroid

+0

哪個提升枚舉呢? – CygnusX1

+0

的boost :: date_time的::平日/ MONTHS_OF_YEAR和boost :: date_time的:: nth_kday_of_month < Date_t > :: WEEK_NUM – DrFroid

4

的問題是,一個枚舉的聲明不僅創建類型,但它也宣佈與給定值的枚舉標識符。當你做一個typedef時,你只是爲這個類型創建一個本地別名,但是這些值不會被帶到新的名字空間。也就是說,編譯器會看到B::BBar,它將通過typedef知道您指的是A::ABar。但是,在處理B::a時,在B名稱空間中沒有引用該名稱空間的內容。

爲了達到這個目的,您還必須將ab放入新的命名空間,這不是由typedef完成的,因爲它們不是類型。反正它是實現像:

namespace A { 
    enum ABar { 
     a, b 
    }; 
} 
namespace B { 
    typedef ::A::ABar BBar; 
    using ::A::a; 
    using ::A::b; 
} 

我不建議這樣做,因爲它會成爲一個維護問題相當迅速(你將不得不記得每次更改原來的一個更新兩個命名空間

至於如何處理這個問題,@ CygnusX1提出的解決方法實際上是一個好的選擇,如果您使用的是C++ 0x編譯器,則該語言允許使用類似的習慣用法,因爲它允許訪問枚舉值通過枚舉類型:

namespace A { 
    enum ABar { a,b }; 
} 
namespace B { 
    typedef A::ABar BBar; 
} 
int main() { 
    std::cout << B::BBar::a << std::endl; // extra enum qualification 
} 
+0

好的,thnaks。這可以幫助我很多..可憐的是,vc 9不兼容C++ 0x,因爲這看起來對我來說是最好的解決方案。但天鵝座解決這個問題的方式也適用於我。 – DrFroid

相關問題