使用聲明似乎並沒有與枚舉類型使用聲明與枚舉?
class Sample{
public:
enum Colour { RED,BLUE,GREEN};
}
using Sample::Colour;
不起作用工作! 我們是否需要爲枚舉類型的每個枚舉器添加使用聲明?像下面那樣
using sample::Colour::RED;
使用聲明似乎並沒有與枚舉類型使用聲明與枚舉?
class Sample{
public:
enum Colour { RED,BLUE,GREEN};
}
using Sample::Colour;
不起作用工作! 我們是否需要爲枚舉類型的每個枚舉器添加使用聲明?像下面那樣
using sample::Colour::RED;
一個類沒有定義一個名稱空間,因此「using」在這裏不適用。
此外,你需要做的枚舉公衆。
如果你想使用同一個類中的枚舉,這裏有一個例子:
class Sample {
public:
enum Colour { RED, BLUE, GREEN };
void foo();
}
void Sample::foo() {
Colour foo = RED;
}
,並從訪問它沒有類:
void bar() {
Sample::Colour colour = Sample::RED;
}
C++標準,7.3。 3.1:
在 使用聲明中指定的成員名稱在中聲明聲明區域,其中 使用聲明出現。 [注意: 只有指定的名字是這樣聲明的 ;在使用聲明中指定的枚舉 名不 宣佈對 使用聲明的聲明 區域統計員。末端注]
爲了增加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。
望着兩個條件的名稱是一個類型:
Colour
因爲依賴基礎Sample<T>
不搜索沒有找到一個類型。 注: 98年版標準不允許使用typename
typename
因此,例如需要typename
關鍵字合格與使用聲明,所以上述修復是不可能的。見Accessing types from dependent base classes和CWG11。
是否有其他方法可以做到這一點 – yesraaj 2009-01-13 07:22:17
本質上與您的問題並不真正相關,但我強烈建議您不要對枚舉和常量使用全大寫標識符。在C/C++中,預處理器#defines通常都是大寫字母,並且它們會修改其他具有相同名稱的符號。 – 2009-01-13 10:05:58
在枚舉上使用範圍解析運算符::(如「sample :: Color :: RED」)是編譯器特定的擴展,而不是標準的C++。 – bk1e 2009-01-13 17:50:34