我有一个同名的类和一个枚举值。在类里面,我想使用给出错误的枚举。有没有什么方法可以重命名或移动到不同的命名空间来使用枚举?
例子:
namespace foo {
enum bar {
BAD
};
class BAD {
void worse () {
bar b = BAD; // error
}
};
};
最佳答案
这是执行名称查找的棘手部分之一。
C++ 中有两种标识符作用域,一种用于类类型,一种用于通用标识符作用域。枚举值 BAD 位于通用标识符范围内,而类类型 BAR 位于类标识符范围内。这就是允许您同时拥有枚举值和具有相同名称的类的原因:两个名称不会冲突。
在 BAD 类中,标识符查找规则将在找到枚举之前找到 BAD 类,从而找到错误。现在,如果您完全限定标识符,那么名称查找将首先检查全局标识符范围并匹配枚举值。另一方面,您必须添加 struct
或 class
关键字来声明 BAD 类型的变量。
namespace foo {
enum bad { BAD; };
class BAD {
void worse() { bad b = ::foo::BAD; } // fully qualified will match the enum
};
}
int main() {
// foo::BAD b; // error, foo::BAD is an enum, not a type
class foo::BAD b; // correct
}
现在,我建议不要使用这种用法。重用这样的标识符通常不是一个好主意。代码会更复杂,并且可能会误导不经意的读者(相同的非限定标识符在不同的上下文中使用时指的是不同的东西)。如果名称确实需要BAD
,请考虑为类或枚举使用封闭的命名空间或类(最好是那里的枚举)。
关于c++ - 使用同名的类和枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250872/