命名空间与两个大型库冲突

时间:2012-02-14 16:38:40

标签: c++ namespaces name-clash

我正在尝试使用两个非常大的C ++库来编写自己的库和应用程序集,并且在两个库的主头类中都使用了指令。冲突在于一个类,称为ve​​ctor(使用std :: vector)。一个标题有“using namespace std”,这会让事情变得混乱。

在使用“using namespace”之后,是否有办法从命名空间中排除标识符?

4 个答案:

答案 0 :(得分:2)

有没有办法让蠕虫回到罐子里?

没有。

最好的选择是使用using指令修复标头。删除它并在声明中添加所需的std::前缀。

答案 1 :(得分:2)

在C ++中无法取消使用。在这种情况下,我能想到的唯一选择是:

  • 让图书馆作家修复他们的图书馆。标题中的using绝对是库中应该修复的错误。

  • 通过使用单独的,完全分隔的实现文件,在应用程序中完全隔离这两个库。如果两个库需要进行通信,则必须在代码中创建某种介体以将它们粘合在一起。

答案 2 :(得分:1)

您可以创建自己的包装器头,其中包含库头,同时将其包装在命名空间中。

例如,对于任何给定标题<brokenlib.h>,请创建"mybrokenlib.h",如下所示:

#ifndef MY_WRAPPER_HEADER_H
#define MY_WRAPPER_HEADER_H 1

namespace brokenlib
{
#include <brokenlib.h>
}

#endif

标题显然仍然具有using语句,但现在它会将std中的符号注入brokenlib命名空间而不是全局命名空间。

希望图书馆没有很多需要包装的入口点。

编辑:正如DavidRodríguez所指出的,只有当您使用的库只是标题时,这才有效。唯一真正的解决方案是修复库(希望它们是开源的吗?)

答案 3 :(得分:0)

我想这个简单的盾牌将是一个解决方案:

namespace myShield {
    #include "problematicheader.h"
}

编辑:仅适用于仅限标题的库:/