Разрешение конфликтов пространства имен - PullRequest
5 голосов
/ 25 марта 2010

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

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 везде, как это предлагается ниже, была бы невозможной.

Ответы [ 2 ]

10 голосов
/ 25 марта 2010

Вся точка пространства имен побеждена, когда вы говорите "using namespace".

Так что убери это и используй пространства имен. Если вы хотите использовать директиву 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::...

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

3 голосов
/ 25 марта 2010

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

int main()
{
    myCustomizations::OneMoreClass foo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...