2016-06-15 2 views
2

У меня возникают проблемы с доступом к перечислениям, которые завернуты в пространства имен.Доступ к перечислению в пространстве имен

Моя проблема заключается в том, что у меня есть два пространства имен для двух разных реализаций алгоритма. Проблема в том, что у меня есть два перечисления для режимов в каждом пространстве имен, каждый из которых немного отличается. В одном файле я хочу сравнить две реализации. Возникает вопрос, что я не могу использовать перечисления без двух столкновений. Может ли один описать, как я мог бы идти об этом без using namespace

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

Примечание это просто пример, у меня это немного сложнее, но это показывает, что я хочу сделать. Я хочу попробовать и решить это так, а не рефакторинг в глобальное перечисление или переименование режимов, хотя это вариант, если нет другого пути.

+1

Вы пробовали namespace1 :: mode1? Это сработало? Если нет, каков был фактический результат? Как правило, вы получаете доступ к перечислению точно так же, как и к любому другому имени. –

+0

Спасибо, я думаю, что все получилось. Я неправильно понял эту концепцию, когда я попытался это исправить. Спасибо за помощь (я все еще довольно новый с пространствами имен) – Dast99

ответ

3

Я не уверен, в чем проблема, но эта работа подходит для вас? если нет, пожалуйста, подробнее рассказать на примере:

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 значения назначаются автоматически, если вам нужно сравнить enum с от его вам необходимо ввести «присвоенное значение» вручную:

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.

+0

Как я упоминал в своем комментарии. Я пытался определить, как получить доступ к переименованию. однако у меня есть вопрос, если бы я дал две перечисления одинаковые значения в двух разных пространствах имен, если бы они были эквивалентными (например, оба они точно идентичны, за исключением пространства имен) – Dast99

+0

Я был обновлен по почте, пожалуйста, прочитайте ... –

+0

Спасибо за обновить, я буду изучать его – Dast99

Смежные вопросы