我有一个带有大量符号的命名空间,但我要覆盖其中一个:
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。因此,如下所示,用MyCustomizations :: OneMoreClass替换OneMoreClass是不可能的。
答案 0 :(得分:10)
当您说“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
,并且可能永远不会在全局范围内。它在当地范围内很好。
答案 1 :(得分:3)
您应该明确指定您想要的OneMoreClass
:
int main()
{
myCustomizations::OneMoreClass foo;
}