Разрешение конфликтов пространства имен

У меня есть пространство имен с тонной символов, которые я использую, но я хочу перезаписать одного из них:

external_library.h

namespace LottaStuff
{
class LotsOfClasses {};
class OneMoreClass {};
};

my_file.h

using namespace LottaStuff;
namespace MyCustomizations
{
class OneMoreClass {};
};
using MyCustomizations::OneMoreClass;

my_file.cpp

int main()
{
    OneMoreClass foo; // error: reference to 'OneMoreClass' is ambiguous
    return 0;
}

Как делают я добираюсь, разрешают 'неоднозначную' ошибку, не обращаясь к замене 'использования пространства имен LottaStuff' с тысячей человек, "использующих xxx"; операторы?

Править: Кроме того, скажите, что я не могу отредактировать my_file.cpp, только my_file.h. Так, заменяя OneMoreClass MyCustomizations:: OneMoreClass везде, как предложено ниже не был бы возможен.

5
задан Kyle 25 March 2010 в 19:47
поделиться

2 ответа

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

Так что возьмите это и используйте пространства имен. Если вам нужна директива using, поместите ее в main:

int main()
{
    using myCustomizations::OneMoreClass;

    // OneMoreClass unambiguously refers
    // to the myCustomizations variant
}

Узнайте, что делают директивы using . По сути, у вас есть следующее:

namespace foo
{
    struct baz{};
}

namespace bar
{
    struct baz{};
}

using namespace foo; // take *everything* in foo and make it usable in this scope
using bar::baz; // take baz from bar and make it usable in this scope

int main()
{
    baz x; // no baz in this scope, check global... oh crap!
}

Один или другой будет работать, а также поместить его в область видимости для main . Если вы находите пространство имен действительно утомительным для ввода, создайте псевдоним:

namespace ez = manthisisacrappilynamednamespace;

ez::...

Но никогда не используйте , используя пространство имен в заголовке, и, вероятно, никогда в глобальной области. Это нормально в локальных масштабах.

10
ответ дан 18 December 2019 в 14:44
поделиться

Вы должны явно указать, какой OneMoreClass вы хотите:

int main()
{
    myCustomizations::OneMoreClass foo;
}
3
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

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