【问题标题】:Suggestion to resolve an enum ambiguity name clash?解决枚举歧义名称冲突的建议?
【发布时间】:2012-07-11 19:18:40
【问题描述】:

我在代码库中有一个类似于以下内容的库:

namespace rat {

   ...

   enum myEnum {
      BLUE,
      RED
   }

   ...
} //namespace rat

稍后我尝试使用之前的库在代码库中编译一个应用程序,当我使用命名空间 rat(代码库主命名空间)说 BLUE 可能是 rat::myEnum rat::BLUE 或 @ 时,它会警告我有歧义987654324@ rat::enums::BLUE 来自我不熟悉(而且不是我的)的其他文件,它有一个枚举 Freq 和一个名为 BLUE 的人在命名空间 rat 内的命名空间枚举中......

用户代码中有没有办法说明我现在想要哪个?还是我必须在说命名空间 mylib 中嵌套 mylibs 枚举,然后说 rat::enums::BLUE 或 rat::mylib::BLUE ?

【问题讨论】:

  • 如果你有 C++11,enum class 会创建一个新的作用域。
  • 那么,你把using namespace 指令放在哪里了?似乎所有编译器投诉都在单独的命名空间中(ratrat::enums)。
  • 我没有 C++11,并且应用程序有一个 using namespace rat。这将 myEnum 和 enums::Freq 纳入范围,两者都包含 BLUE

标签: c++ enums namespaces


【解决方案1】:

枚举常量的完整明确名称将是::rat::BLUE::rat::enums::BLUE 等。

记住,表达式开头的:: 代表全局命名空间

【讨论】:

    【解决方案2】:

    我通常在 C++03(C++11 之前!)中所做的是将 enums 嵌套在 structs 中,这样它们就不会泄漏:

    namespace rat {
      struct myEnum {
        enum Enum {
          blue, red
        };
      };
    }
    

    您必须将变量定义为rat::myEnum::Enum,将值定义为rat::myEnum::blue,但通常myEnum 应该像Color 这样有意义,因此命名不是多余的。

    这在某种程度上模拟了 C++11 class enums,因此如果您可以访问 C++11 编译器,则应该使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多