题
using 声明似乎不适用于枚举类型
class Sample{
public:
enum Colour { RED,BLUE,GREEN};
}
using Sample::Colour;
不起作用!我们是否需要为每个枚举类型的枚举器添加 using 声明?像下面这样
using sample::Colour::RED;
解决方案
一个类没有定义命名空间,因此“使用”在这里不适用。
此外,你需要做的枚举公众。
如果你想使用同一个类中的枚举,下面是一个例子:
class Sample {
public:
enum Colour { RED, BLUE, GREEN };
void foo();
}
void Sample::foo() {
Colour foo = RED;
}
和从访问它没有类:
void bar() {
Sample::Colour colour = Sample::RED;
}
其他提示
添加到 Stevela 的 回答, ,原始代码的问题是您引用了一个成员,但 using 声明本身并不是成员声明:
7.3.3/6 有:
班级成员的使用解释应为成员 - 持续。
为了强调这一点,以下示例确实有效:
class Sample
{
public:
enum Colour { RED,BLUE,GREEN};
};
class Derived : public Sample
{
public:
using Sample::Colour; // OK
};
最后,正如 Igor Semenov 所指出的 这里, ,即使您将枚举定义移动到命名空间中,从而允许使用声明,使用声明也只会将枚举类型的名称声明到命名空间中(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
}
依赖的基本类型
为了允许部分和显式专业化,当编译器解析类模板时,它不会在依赖基类中执行任何查找。因此,以下以 Sample 作为模板的变体无法编译:
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/2):
模板声明或定义中使用的且依赖于模板参数的名称被假定不会命名类型,除非适用的名称查找找到类型名称或该名称由关键字 typename 限定。
查看名称成为类型的两个条件:
- 查找
Colour
找不到类型,因为依赖基数Sample<T>
没有被搜索到。 - 该名称不符合条件
typename
因此,该示例需要 typename
关键词:
template <typename T>
class Derived : public Sample<T>
{
public:
using typename Sample<T>::Colour; // Colour is treated as a typedef-name
Colour foo () // OK
{
return this->RED;
}
};
笔记: '98版本的标准不允许 typename
与 using 声明一起使用,因此上述修复是不可能的。看 从依赖基类访问类型 和 CWG11.
C ++标准,7.3.3.1:
在指定的成员名称 using声明在声明 声明性区域,其中 使用声明出现。 [ 注意: 只有指定的名字好 声明;指定的枚举 名称using声明不 宣布对普查员 使用声明的声明 区域。末端纸币]