我的项目使用两个第三方开源库,两个库都定义了类型BDD
,两者都不使用名称空间。
有没有办法解决名称冲突?也许强制一个库进入自定义命名空间?
其他信息:
第一个库仅将BDD
用作类型别名(typedef int BDD
),因此它不会调用BDD
上的任何方法。
答案 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)
由于这些库是开源的,因此您可以向其中至少一个库添加命名空间,并向库维护者提供补丁。
你将完成两件事: