У меня есть перечисление в пространстве имен, и я хотел бы использовать его, как будто это было в другом пространстве имен. Интуитивно, я полагал, что мог использовать 'использование' или 'определение типа' для выполнения этого, но ни один на самом деле не работает. Фрагмент кода для доказательства его, протестированный на 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
};
}
Но это нарушает принцип DRY. Существует ли лучший путь?
Оберните существующее пространство имен во вложенное пространство имен, которое вы затем "используете" в исходном пространстве имен.
namespace foo
{
namespace bar_wrapper {
enum bar {
A
};
}
using namespace bar_wrapper;
}
namespace buzz
{
using namespace foo::bar_wrapper;
}
Хотя мне больше всего нравится подход Mark B, потому что он не нарушает существующий код, вы также можете сделать следующее:
namespace foo { enum bar { A, B [..] }; } namespace buzz { using foo::bar; using foo::A; using foo::B; [..] }
Проблема в том, что объявление using извлекает только имя перечисления, а не имена его значений. Перечисления не являются областями действия и не содержат имен счетчики . Я не думаю, что можно импортировать сами значения перечисления. Попробуйте обернуть перечисление в структуру / пространство имен и использовать его.
Если вам действительно нужно это сделать, попробуйте using namespace foo;
вместо using foo::bar;
. Однако гораздо лучше инкапсулировать перечисление в класс или в другое пространство имен.