解决命名空间冲突

时间:2010-03-25 19:39:46

标签: c++ namespaces

我有一个带有大量符号的命名空间,但我要覆盖其中一个:

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是不可能的。

2 个答案:

答案 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;
}