c++ - 使用同名的类和枚举?

标签 c++ class enums

我有一个同名的类和一个枚举值。在类里面,我想使用给出错误的枚举。有没有什么方法可以重命名或移动到不同的命名空间来使用枚举?

例子:

namespace foo {
    enum bar {
        BAD
    };

    class BAD {
        void worse () {
            bar b = BAD; // error
        }
    };
};

最佳答案

这是执行名称查找的棘手部分之一。

C++ 中有两种标识符作用域,一种用于类类型,一种用于通用标识符作用域。枚举值 BAD 位于通用标识符范围内,而类类型 BAR 位于类标识符范围内。这就是允许您同时拥有枚举值和具有相同名称的类的原因:两个名称不会冲突。

在 BAD 类中,标识符查找规则将在找到枚举之前找到 BAD 类,从而找到错误。现在,如果您完全限定标识符,那么名称查找将首先检查全局标识符范围并匹配枚举值。另一方面,您必须添加 structclass 关键字来声明 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/

相关文章:

c++ - 在 IIS ISAPI 筛选器中设置自定义 header 值

c++ - 引发异常:读取访问冲突。这是对象数组中的nullptr

c++ - 函数调用继承 C++

c++ - 显示结构/类错误数组 C++

c++ - 控制 ENUM 内容的 boolean 值 - C++

c++ - 枚举、类、命名空间和长名称

c++ - 如何访问类的静态成员?

c++ - 递归fft计算的段错误

java - 如果处理请求体时发生异常,则不使用 Jersey 自定义 ExceptionMapper

c++ - 为什么 'wait with predicate'解决了条件变量的 'lost wakeup'?