访问命名空间内的枚举

Das*_*t99 3 c++ enums namespaces

我在访问包含在命名空间中的枚举时遇到一些问题。

我的问题是我有两个命名空间用于算法的两种不同实现。问题是我在每个命名空间中有两个模式的枚举,每个枚举都略有不同。我想在一个文件中比较这两种实现。出现的问题是,如果两者不发生冲突,我就无法使用枚举。任何人都可以描述我如何在没有using namespace

namespace implementation1{
enum modes {mode_standard, mode_special, fast_mode}
}
namespace implementation2{
enum modes {mode_default, mode_repeat, fast_mode}
}
Run Code Online (Sandbox Code Playgroud)

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

Alv*_*sta 5

我不确定你的问题是什么,但这对你来说没问题吗?如果没有,请详细说明示例:

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;
}
Run Code Online (Sandbox Code Playgroud)

更新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;
}
Run Code Online (Sandbox Code Playgroud)

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

namespace implementation1 {
enum modes { mode_standard, mode_special, fast_mode = 3 };
}
namespace implementation2 {
enum modes { first_mode, mode_default, mode_repeat, fast_mode = 3 };
}
Run Code Online (Sandbox Code Playgroud)

但它很容易出错,我强烈建议不要使用它,如果您需要有关此内容的详细信息,我建议阅读有关新作用域枚举的动机(例如enum class:),可从 c++11 获得。