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

У меня есть перечисление в пространстве имен, и я хотел бы использовать его, как будто это было в другом пространстве имен. Интуитивно, я полагал, что мог использовать 'использование' или 'определение типа' для выполнения этого, но ни один на самом деле не работает. Фрагмент кода для доказательства его, протестированный на 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. Существует ли лучший путь?

28
задан Joseph Garvin 20 July 2010 в 18:49
поделиться

4 ответа

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

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

namespace buzz
{
    using namespace foo::bar_wrapper;
}
25
ответ дан 28 November 2019 в 03:28
поделиться

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

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

namespace buzz {
 using foo::bar;
 using foo::A;
 using foo::B;
 [..]
}
8
ответ дан 28 November 2019 в 03:28
поделиться

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

6
ответ дан 28 November 2019 в 03:28
поделиться

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

1
ответ дан 28 November 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: