即使在使用命名空间后仍存在名称冲突怎么办?

时间:2012-02-02 15:53:28

标签: c++

我们通常使用命名空间来避免C ++中的名称冲突。但是如果有两个不同的库有一个类,具有相同的命名空间名称和类名怎么办?有工作吗?

(PS:我很确定,这是一种罕见的情况,我从来没有遇到过,只是偶然发现了我的想法)

3 个答案:

答案 0 :(得分:1)

这个想法是使用与公司/集团本身相关的东西 这样可以避免碰撞 专业图书馆极不可能选择像MyNamespace那样微不足道的东西。

就像Company::Project::Module

在具有org.apache etc

的java中,这一点更加清晰

答案 1 :(得分:0)

您可以使用

重命名其中一个命名空间
namespace <new> = <old>;

但那只会让你到目前为止。这是一个例子:

namespace aaa {
   int foo() { return 42; }
}

namespace zzz {
   int foo() { return -42; }
}

namespace bbb = aaa;

int main() {
    aaa::foo();         //Original namespace is still there
    bbb::foo();  //but it is also available with a new name
    zzz::foo();  //No clash, that's what namespaces are for
    return 0;
}

但由于重命名实际上只是一个别名,因此aaa命名空间保持不变。此代码将为您提供重复的符号错误(无论它埋在.h文件中有多深):

namespace aaa {
   int foo() { return 42; }
}

namespace aaa {
   int foo() { return -42; }
}

你可以通过在你自己的命名空间声明中包装冲突命名空间来解决它,如下所示:

#include <stdio.h>

namespace aaa {
   int foo() { return 42; }
}

namespace zzz {
#include "clash.h"
}

namespace aaa2 = zzz::aaa;

int main() {
    printf("%d\n", aaa::foo());   //Original works
    printf("%d\n", aaa2::foo());  //Non-clashing through alias
    printf("%d\n", zzz::aaa::foo());  //Non-clashing real name
    return 0;
}

但该解决方案也只能在简单的代码中使用,因为clash.h中包含的所有文件都将以zzz命名空间结束。

+我认为重命名std是禁止的,只是出于常识。

答案 2 :(得分:0)

它可能会发生,但它不太可能对你造成太大的伤害。命名空间名称不仅必须完全相同,而且必须实际使用两个库。如果他们以某种合理的方式命名他们的命名空间,他们的名字将表明他们的目的 - 即使有两个库使用GenericXMLParser作为他们的命名空间,并且可能有一些共同的类名,你真的希望在一个项目中使用它们吗?

这确实会使某些命名空间名称成为一个坏主意,例如boostOgre。任何使用它们的人(原始用户除外)都应该期望他们的库在许多情况下无法使用。一个不太常见的名称,如Pie,在大多数情况下,对于大多数人来说可能会很好。如果使用Pie的两个库被广泛使用,则可能需要改变;在这种情况下,命名空间重命名技巧可用于保持与旧代码的向后兼容性。