возможно ввести существующий тип перечисления?

#c #enums #typedef

#c #перечисления #typedef

Вопрос:

Учитывая следующее:

 namespace otherns
{
    enum MyEnum_e { MyEnum_YES, MyEnum_NO };
}

namespace myns
{
    typedef otherns::MyEnum_e MyEnum_e;
}
  

Почему следующее недопустимо?

 int e = myns::MyEnum_YES;
  

Я получаю ошибку компилятора с указанием:

 'MyEnum_YES' is not a member of 'myns'
  

Ответ №1:

Поскольку значения перечисления находятся в пространстве имен otherns , а не в качестве дочернего элемента MyEnum_e : для ссылки MyEnum_YES вы вводите otherns::MyEnum_YES .

Вы могли бы попробовать это:

 namespace otherns
{
    namespace MyEnum_e_space {
    enum MyEnum_e { MyEnum_YES, MyEnum_NO };
    }
    using namespace MyEnum_e_space;
}

namespace myns
{
    using namespace otherns::MyEnum_e_space;
}
  

Хотя использование using не рекомендуется..

Комментарии:

1. Это не рекомендуется, просто используйте его разумно; эмпирическое правило таково: не в файлах заголовков (потому что вы не хотите загрязнять пространство имен или даже конфликтовать с разрешением символов для любого нечетного будущего клиента файла заголовков). Не стесняйтесь использовать using в своих собственных блоках компиляции