我们通常使用命名空间来避免C ++中的名称冲突。但是如果有两个不同的库有一个类,具有相同的命名空间名称和类名怎么办?有工作吗?
(PS:我很确定,这是一种罕见的情况,我从来没有遇到过,只是偶然发现了我的想法)
答案 0 :(得分:1)
这个想法是使用与公司/集团本身相关的东西
这样可以避免碰撞
专业图书馆极不可能选择像MyNamespace
那样微不足道的东西。
就像Company::Project::Module
。
在具有org.apache etc
答案 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
作为他们的命名空间,并且可能有一些共同的类名,你真的希望在一个项目中使用它们吗?
这确实会使某些命名空间名称成为一个坏主意,例如boost
或Ogre
。任何使用它们的人(原始用户除外)都应该期望他们的库在许多情况下无法使用。一个不太常见的名称,如Pie
,在大多数情况下,对于大多数人来说可能会很好。如果使用Pie
的两个库被广泛使用,则可能需要改变;在这种情况下,命名空间重命名技巧可用于保持与旧代码的向后兼容性。