столкновение пространства имен с двумя большими библиотеками - PullRequest
2 голосов
/ 14 февраля 2012

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

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

Ответы [ 4 ]

2 голосов
/ 14 февраля 2012

Нет способа не использовать C ++. В этом случае единственные варианты, о которых я могу думать:

  • Попросите авторов библиотеки исправить их. using в заголовке - это абсолютная ошибка в библиотеке, которую следует исправить.

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

2 голосов
/ 14 февраля 2012

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

Нет.

Лучший вариант - исправить заголовок с помощью директивы using.Удалите его и добавьте необходимые std:: префиксы к объявлениям.

1 голос
/ 14 февраля 2012

Вы можете создавать свои собственные заголовки-обертки, которые включают заголовок библиотеки при переносе его в пространство имен.

например, для любого заданного заголовка <brokenlib.h> создайте "mybrokenlib.h", который выглядит следующим образом:

#ifndef MY_WRAPPER_HEADER_H
#define MY_WRAPPER_HEADER_H 1

namespace brokenlib
{
#include <brokenlib.h>
}

#endif

Очевидно, что заголовок все еще будет содержать оператор using, но теперь он будет вставлять символыиз std в пространство имен brokenlib вместо глобального пространства имен.

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

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

0 голосов
/ 14 февраля 2012

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

namespace myShield {
    #include "problematicheader.h"
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...