Пространство имен C ++ 'использование' декларативного для класса 'enum - PullRequest
10 голосов
/ 09 июня 2011

У меня есть хорошее понимание того, как C ++ 'используя' декларацию и директивы работают.Тем не менее, я поставлен в тупик на этом ... Может быть, это не возможно?Я хочу избежать необходимости проверять мои переменные перечисления:

namespace Foo { 
   class MyClass {
      public: 
         enum MyEnum { X, Y, Z };
   }
}

И теперь, вне этого пространства имен, я хотел бы иметь возможность делать такие вещи как:

using Foo::MyClass.MyEnum;
MyEnum letter = MyEnum::x;

Но, очевидно,это не способ сделать это?Готов поспорить, что это возможно, но мои обозначения неверны ... Я также пытался использовать Foo :: MyClass :: MyEnum, но затем компилятор считает Foo :: MyClass пространством имен.

Добавлено: Как видите, раздражает необходимость полностью декларировать все ...

Foo::MyClass::MyEnum value = Foo::MyClass::X;

Ответы [ 3 ]

5 голосов
/ 09 июня 2011

Это не отвечает на ваш вопрос напрямую, но если вы хотите сэкономить нажатия клавиш, вы можете попробовать использовать typedef вместо этого.

typedef Foo::MyClass::MyEnum MyClassEnum;

Кстати, похоже, что ваш вопрос задавался по переполнению стека до . Из ответа на этот вопрос:

Класс не определяет пространство имен, поэтому «использование» не применимо здесь.

1 голос
/ 10 июня 2011

C ++ 03 не поддерживает полностью квалифицированные типы enum, но это расширение MSVC.C ++ 0x сделает этот стандарт, и я считаю, что вы можете using и enum в C ++ 0x.Однако в C ++ 03 я не верю, что ваша проблема может быть решена.

1 голос
/ 09 июня 2011

Я получил следующее для компиляции, после того, как много возился.Я думаю, что это будет самое близкое, что вы можете получить без typedef'ing.

namespace Foo {
    class MyClass {
        public:
            enum MyEnum { X, Y, Z };
    };
};

namespace Foo2 {
    using Foo::MyClass; 

    class AnotherClass {
        public:

            AnotherClass(){
                MyClass::MyEnum value = MyClass::X; 
            }
    };
};

int main(){

    return 1;
}

Вы также можете использовать MyClass в качестве базового класса, но я сомневаюсь, что это то, что вы хотите сделать.

namespace Foo2 {
    using namespace Foo;
    class AnotherClass : public MyClass{
        public:
            AnotherClass(){
                MyEnum value = X; 
            }
    };
};

Здесь также есть хорошая информация. пространства имен для типов перечислений - лучшие практики

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...