【问题标题】:Accessing an enum within namespace访问命名空间内的枚举
【发布时间】:2016-06-15 05:08:09
【问题描述】:

我在访问封装在命名空间中的枚举时遇到了一些问题。

我的问题是我有两个命名空间用于算法的两种不同实现。问题是每个命名空间中的模式都有两个枚举,每个都略有不同。在一个文件中,我想比较这两种实现。出现的问题是我不能在没有两者冲突的情况下使用枚举。谁能描述一下没有using namespace我会如何做这件事@

namespace implementation1{
enum modes {mode_standard, mode_special, fast_mode}
}
namespace implementation2{
enum modes {mode_default, mode_repeat, fast_mode}
}

请注意,这只是我的一个示例,它有点复杂,但它展示了我想要做什么。我想尝试以这种方式解决它,而不是重构为全局枚举或重命名模式,但如果没有其他方法,这是一个选项。

【问题讨论】:

  • 你试过 namespace1::mode1 吗?它奏效了吗?如果不是,实际结果是什么?通常,您访问枚举的方式与访问任何其他名称的方式完全相同。
  • 谢谢,我认为它成功了。当我尝试解决这个问题时,我误解了这个概念。感谢您的帮助(我对命名空间还是很陌生)

标签: c++ enums namespaces


【解决方案1】:

我不确定您的问题是什么,但这项工作适合您吗?如果不是,请详细说明示例:

namespace implementation1 {
enum modes { mode_standard, mode_special, fast_mode };
}
namespace implementation2 {
enum modes { mode_default, mode_repeat, fast_mode };
}

int main(int argc, char *argv[]) {
  if (implementation1::fast_mode == implementation2::fast_mode) { // foo mode use...
  }
  return 0;
}

更新enum 可能会破坏您的“等价性”:

namespace implementation1 {
enum modes { mode_standard, mode_special, fast_mode };
}
namespace implementation2 {
enum modes { first_mode, mode_default, mode_repeat, fast_mode };
}

int main(int argc, char *argv[]) {
  // foo mode use... this not work now
  if (implementation1::fast_mode == implementation2::fast_mode) {
  }
  return 0;
}

enum 的值是自动分配的,如果您需要比较他名字中的 enums,您需要手动管理“分配的值”:

namespace implementation1 {
enum modes { mode_standard, mode_special, fast_mode = 3 };
}
namespace implementation2 {
enum modes { first_mode, mode_default, mode_repeat, fast_mode = 3 };
}

但它容易出错,我强烈建议不要使用它,如果你 需要有关此的详细信息我推荐 read 关于新 scoped 枚举的动机(例如:enum class),可从 c++11 获得。

【讨论】:

  • 正如我在评论中提到的。我试图确定如何访问枚举本身。但是我确实有一个问题,如果我在两个不同的命名空间中给两个枚举相同的值,它们是否是等价的(例如,除了命名空间之外,两者完全相同)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2012-10-18
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多