Как разрешить конфликты имен классов между двумя сторонними библиотеками, которые не используют пространства имен? - PullRequest
0 голосов
/ 18 мая 2018

Мой проект использует две сторонние библиотеки с открытым исходным кодом, обе библиотеки определяют тип BDD, и обе не используют пространства имен.

Есть ли способ разрешения конфликта имен?Может быть, принудительно заставить одну библиотеку в пользовательском пространстве имен?

Дополнительная информация: первая библиотека использует BDD только в качестве псевдонима типа (typedef int BDD), поэтому она не вызывает никаких методов для BDD.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Поскольку эти библиотеки с открытым исходным кодом, вы можете добавить пространство имен хотя бы к одному из них и предоставить свой патч сопровождающему библиотеки.

Вы достигнете двух вещей:

  1. исправьте ваше конкретное столкновение имен, а
  2. сделает мир лучше.
0 голосов
/ 18 мая 2018

Поскольку одна из ваших библиотек использует BDD в качестве псевдонима только для int (я предполагаю, что эта библиотека называется lib1, а другая lib2), вы можете просто изменить имя этого псевдонима.сказав препроцессору переименовать его перед включением библиотеки, например, так:

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

#include <lib2>

Если вам когда-либо понадобится использовать имя BDD из lib1 в вашем коде, вы можете ссылаться на него с помощью BDD_lib1 (или просто с int, если вы не беспокоитесь о том, что его тип может измениться в будущей версии lib1).


Однако я бы счел этот подход только обходным путем,и не является правильным решением, так что вы можете подумать о том, чтобы поступить так, как предложил @YSC в своем ответе, и предоставить исправление, чтобы другие люди, пытающиеся использовать библиотеки, не столкнулись с той же проблемой.


эта работа в более общем сценарии?

Если бы BDD был не просто псевдонимом простого типа, а отдельным классом, он мог бы столкнуться с проблемами из-за искажения имени в C ++, поэтому этот метод будет работать, только еслиимя BDD яне важно ни в каких сценариях, где искажение имени появилось бы.Это накладывает более или менее следующие ограничения:

  • BDD не должно иметь никаких не встроенных методов
  • любых типов в зависимости от BDD (например, специализация A<BDD> изшаблон класса template <typename> class A; является типом, зависящим от `BDD), не должен иметь никаких не встроенных методов
  • все функции / методы, список аргументов которых включает типы в зависимости от BDD, должны быть либо встроенными, либо иметь связь с C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...