Столкновение пространства имен с двумя большими библиотеками

Я пытаюсь использовать две очень большие библиотеки C++ для написания своей собственной библиотеки и набора приложений, и там используются директивы, присутствующие в основных классах заголовков обеих библиотек. Конфликт лежит в одном классе, называемом вектором (с std::vector). Один заголовок имеет "использование пространства имен std", и это все портит.

Есть ли способ исключить идентификатор из пространства имен после того, как "использование пространства имен" уже было написано?

4 ответа

Решение

Есть ли способ вернуть червей обратно в банку?

Нет.

Лучший вариант - исправить заголовок с помощью директивы 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, но теперь он будет вводить символы из std в brokenlib пространство имен вместо глобального пространства имен.

Надеюсь, в библиотеке не так много точек входа, которые нужно обернуть.

РЕДАКТИРОВАТЬ: Как отметил Дэвид Родригес, это работает, только если библиотеки, которые вы используете, только для заголовка. Единственное верное решение - исправить библиотеки (надеюсь, они с открытым исходным кодом?)

Я думаю, что этот простой щит будет решением:

namespace myShield {
    #include "problematicheader.h"
}

РЕДАКТИРОВАТЬ: только для библиотек только заголовка:/

Другие вопросы по тегам