使用声明似乎并没有与枚举类型使用声明与枚举?
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