2009-01-13 114 views
5

使用聲明似乎並沒有與枚舉類型使用聲明與枚舉?

class Sample{ 
public: 
enum Colour { RED,BLUE,GREEN}; 
} 

using Sample::Colour; 

不起作用工作! 我們是否需要爲枚舉類型的每個枚舉器添加使用聲明?像下面那樣

using sample::Colour::RED; 
+0

是否有其他方法可以做到這一點 – yesraaj 2009-01-13 07:22:17

+1

本質上與您的問題並不真正相關,但我強烈建議您不要對枚舉和常量使用全大寫標識符。在C/C++中,預處理器#defines通常都是大寫字母,並且它們會修改其他具有相同名稱的符號。 – 2009-01-13 10:05:58

+0

在枚舉上使用範圍解析運算符::(如「sample :: Color :: RED」)是編譯器特定的擴展,而不是標準的C++。 – bk1e 2009-01-13 17:50:34

回答

10

一個類沒有定義一個名稱空間,因此「using」在這裏不適用。

此外,你需要做的枚舉公衆。

如果你想使用同一個類中的枚舉,這裏有一個例子:

class Sample { 
public: 
    enum Colour { RED, BLUE, GREEN }; 

    void foo(); 
} 

void Sample::foo() { 
    Colour foo = RED; 
} 

,並從訪問它沒有類:

void bar() { 
    Sample::Colour colour = Sample::RED; 
} 
5

C++標準,7.3。 3.1:

在 使用聲明中指定的成員名稱在中聲明聲明區域,其中 使用聲明出現。 [注意: 只有指定的名字是這樣聲明的 ;在使用聲明中指定的枚舉 名不 宣佈對 使用聲明的聲明 區域統計員。末端注]

6

爲了增加Stevela的answer,與原代碼的問題是,你指的一員,但使用的聲明本身不是一個成員聲明:

7.3.3/6具有:

類成員 的使用聲明應爲成員聲明。

爲了突出這一點,下面的例子不工作:

class Sample 
{ 
public: 
    enum Colour { RED,BLUE,GREEN}; 
}; 

class Derived : public Sample 
{ 
public: 
    using Sample::Colour; // OK 
}; 

最後,由Igor謝苗諾夫here指出,即使您將枚舉定義成一個命名空間,從而允許使用聲明, using聲明只會將枚舉類型的名稱聲明到名稱空間中(2003標準引用是7.3.3/2)。

namespace Sample 
{ 
    enum Colour { RED,BLUE,GREEN}; 
} 

using Sample::Colour; 
using Sample::BLUE; 


void foo() 
{ 
    int j = BLUE; // OK 
    int i = RED; // ERROR 
} 

從屬基本類型

爲了允許局部和明確的特化,當編譯器解析類模板它不依賴於在基類進行任何查詢。其結果是,與樣品作爲模板以下變化不會編譯:

template <typename T> 
class Sample 
{ 
public: 
    enum Colour { RED,BLUE,GREEN}; 
}; 

template <typename T> 
class Derived : public Sample<T> 
{ 
public: 
    using Sample<T>::Colour; // What kind of entity is Colour? 

    Colour foo()  // Not OK! 
    { 
    return this->RED; 
    } 
}; 

的問題是Derived::Colour如由編譯器(14的對象進行處理。6):

在模板聲明或定義中使用的名稱取決於模板參數,假定不命名類型,除非適用的名稱查找找到類型名稱或名稱是合格的由關鍵字typename。

望着兩個條件的名稱是一個類型:

  1. 查找爲Colour因爲依賴基礎Sample<T>不搜索沒有找到一個類型。

    ​​

    注: 98年版標準不允許使用typename

  2. 名稱不typename

因此,例如需要typename關鍵字合格與使用聲明,所以上述修復是不可能的。見Accessing types from dependent base classesCWG11