2009-01-13 115 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