У меня есть пространство имен с тонной символов, которые я использую, но я хочу перезаписать одного из них:
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 везде, как предложено ниже не был бы возможен.
Когда вы говорите « с использованием пространства имен
», вся точка пространств имен игнорируется.
Так что возьмите это и используйте пространства имен. Если вам нужна директива 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::...
Но никогда не используйте , используя пространство имен
в заголовке, и, вероятно, никогда в глобальной области. Это нормально в локальных масштабах.
Вы должны явно указать, какой OneMoreClass
вы хотите:
int main()
{
myCustomizations::OneMoreClass foo;
}