如何解决两个不使用命名空间的第三方库之间的类名冲突?

时间:2018-05-18 10:36:58

标签: c++ namespaces

我的项目使用两个第三方开源库,两个库都定义了类型BDD,两者都不使用名称空间。

有没有办法解决名称冲突?也许强制一个库进入自定义命名空间?

其他信息: 第一个库仅将BDD用作类型别名(typedef int BDD),因此它不会调用BDD上的任何方法。

2 个答案:

答案 0 :(得分:4)

由于您的某个库仅使用BDD作为int的别名(我假设此库名为lib1,另一个lib2) ,您可以通过告诉预处理器在包含库之前重命名它来更改此别名的名称,如下所示:

#define BDD BDD_lib1
#include <lib1>
#undef BDD

#include <lib2>

如果您需要在代码中使用BDD中的lib1名称,则可以使用BDD_lib1(或者只有int引用它,如果您&#39 ;不要担心其类型可能会在lib1)的未来版本中发生变化。

但是,我认为这种方法只是一种解决方法,而不是一个真正的解决方案,因此您可能需要考虑在他的答案中建议@YSC并提供补丁,以便其他尝试使用这些库的人不会遇到同样的问题。

这是否适用于更一般的情况?

如果BDD不仅仅是一个简单的类型别名,而是一个单独的类,那么由于C ++的名称损坏,可能会遇到麻烦,所以这个方法只有在名称{{ {1}}在出现名称重整的任何情况下都不重要。这或多或少地施加了以下限制:

  • BDD不得使用任何非内联方法
  • 取决于BDD的任何类型(例如,类模板BDD的特化A<BDD>是依赖于“BDD”的类型,不得包含任何非内联方法
  • 其参数列表包含取决于template <typename> class A;的类型的所有函数/方法必须是内联的,或者具有C链接

答案 1 :(得分:4)

由于这些库是开源的,因此您可以向其中至少一个库添加命名空间,并向库维护者提供补丁。

你将完成两件事:

  1. 修复您的特定命名冲突,
  2. 让世界变得更美好。