Подтвердить что ты не робот

Как импортировать перечисление в другое пространство имен на С++?

У меня есть перечисление в пространстве имен, и я хотел бы использовать его, как если бы он находился в другом пространстве имен. Интуитивно я решил, что могу использовать "использование" или "typedef" для этого, но на самом деле не работает. Фрагмент кода, чтобы доказать это, протестирован на GCC и Sun CC:

namespace foo
{

enum bar {
    A
};

}

namespace buzz
{
// Which of these two methods I use doesn't matter,
// the results are the same.
using foo::bar;
//typedef foo::bar bar;
}

int main()
{
    foo::bar f; // works
    foo::bar g = foo::A; // works

    buzz::bar x; // works
    //buzz::bar y = buzz::A; // doesn't work
    buzz::bar z = foo::A;
}

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

namespace buzz
{
enum bar
{
    A = foo::A
};
}

Но это нарушает принцип

4b9b3361

Ответ 1

Оберните существующее пространство имен в вложенном пространстве имен, которое вы затем "используете" в исходном пространстве имен.

namespace foo
{
    namespace bar_wrapper {
        enum bar {
            A
        };
    }
    using namespace bar_wrapper;
}

namespace buzz
{
    using namespace foo::bar_wrapper;
}

Ответ 2

Хотя мне нравится подход Mark B, потому что он не нарушает существующий код, вы также можете сделать следующее:

namespace foo {
 enum bar {
  A, B [..]
 };
}

namespace buzz {
 using foo::bar;
 using foo::A;
 using foo::B;
 [..]
}

Ответ 3

Проблема здесь в том, что в объявлении using вызывается только имя перечисления, а не имена его значений. Enum не являются областями и не носят по именам нумераторы. Я не думаю, что можно импортировать значения перечисления сами. Попробуйте обернуть перечисление в пространстве struct/namespace и использовать его.

Ответ 4

Если вам действительно нужно это сделать, попробуйте using namespace foo; вместо using foo::bar;. Однако гораздо лучше идея инкапсулировать перечисление в класс или в другое пространство имен.