2

我正在尝试使用两个非常大的 C++ 库来编写我自己的库和应用程序集,并且在两个库的主头类中都有 using 指令。冲突在于单个类,称为向量(带有 std::vector)。一个标题有“使用命名空间标准”,这把事情搞砸了。

在“使用命名空间”已经写好之后,有没有办法从命名空间中排除标识符?

4

4 回答 4

2

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

不。

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

于 2012-02-14T16:51:57.763 回答
2

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

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

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

于 2012-02-14T16:52:08.470 回答
1

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

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

#ifndef MY_WRAPPER_HEADER_H
#define MY_WRAPPER_HEADER_H 1

namespace brokenlib
{
#include <brokenlib.h>
}

#endif

头文件显然仍然有 using 语句,但现在它将符号 fromstd注入brokenlib命名空间而不是全局命名空间。

希望该库没有太多需要包装的入口点。

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

于 2012-02-14T16:50:19.553 回答
0

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

namespace myShield {
    #include "problematicheader.h"
}

编辑:仅适用于标头库:/

于 2012-02-14T16:49:40.137 回答