Как импортировать перечисление в другое пространство имен на С++?
У меня есть перечисление в пространстве имен, и я хотел бы использовать его, как если бы он находился в другом пространстве имен. Интуитивно я решил, что могу использовать "использование" или "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
};
}
Но это нарушает принцип
Ответы
Ответ 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;
. Однако гораздо лучше идея инкапсулировать перечисление в класс или в другое пространство имен.