我正在尝试使用两个非常大的 C++ 库来编写我自己的库和应用程序集,并且在两个库的主头类中都有 using 指令。冲突在于单个类,称为向量(带有 std::vector)。一个标题有“使用命名空间标准”,这把事情搞砸了。
在“使用命名空间”已经写好之后,有没有办法从命名空间中排除标识符?
我正在尝试使用两个非常大的 C++ 库来编写我自己的库和应用程序集,并且在两个库的主头类中都有 using 指令。冲突在于单个类,称为向量(带有 std::vector)。一个标题有“使用命名空间标准”,这把事情搞砸了。
在“使用命名空间”已经写好之后,有没有办法从命名空间中排除标识符?
有没有办法让虫子回到罐子里?
不。
最好的选择是使用 using 指令修复标头。删除它并将所需的std::
前缀添加到声明中。
没有办法在 C++ 中取消使用。在这种情况下,我能想到的唯一选择是:
让图书馆作者修复他们的图书馆。using
在标头中绝对是应该修复的库中的错误。
通过使用单独的、完全划分的实现文件,在您的应用程序中完全隔离这两个库。如果这两个库需要通信,您必须在代码中创建某种中介以将它们粘合在一起。
您可以创建自己的包装标头,其中包含库标头,同时将其包装在命名空间中。
例如,对于任何给定的标头<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 所指出的,这仅在您使用的库是仅标头时才有效。唯一真正的解决方案是修复库(希望它们是开源的?)
我想这个简单的盾牌将是一个解决方案:
namespace myShield {
#include "problematicheader.h"
}
编辑:仅适用于标头库:/