Столкновение пространства имен с двумя большими библиотеками
Я пытаюсь использовать две очень большие библиотеки 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"
}
РЕДАКТИРОВАТЬ: только для библиотек только заголовка:/