我有一个类和一个具有相同名称的枚举值.在课堂里我想使用给出错误的枚举.有没有办法使用枚举而不重命名或移动到不同的命名空间?
例:
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,请考虑为类或枚举使用封闭的命名空间或类(更优选的是枚举).