c – 使用类和枚举名相同?

我有一个类和一个具有相同名称枚举值.在课堂里我想使用给出错误的枚举.有没有办法使用枚举而不重命名或移动到不同的命名空间?

例:

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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...