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

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

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


person tmaric    schedule 14.02.2012    source источник
comment
Написание using namespace std в вашем заголовке - большая ошибка. Я бы серьезно сомневался в качестве остальной части библиотеки.   -  person Sergey Kalinichenko    schedule 14.02.2012
comment
И поэтому никогда не следует using в заголовке. Создателям библиотеки необходимо исправить свой код.   -  person Mark B    schedule 14.02.2012
comment
:) Я не писал эти библиотеки. Должен ли я затем отредактировать всю (меньшую) библиотеку и ввести std ::? Это путь?   -  person tmaric    schedule 14.02.2012
comment
Посмотрите здесь: stackoverflow.com/questions / 167862 / how-can-i-unuse-a-namespace   -  person Bojan Komazec    schedule 14.02.2012
comment
Из любопытства, что это за библиотеки?   -  person David Rodríguez - dribeas    schedule 14.02.2012
comment
Даже если вы не писали библиотеку, вы можете изменить файлы заголовков. Идите и исправьте это.   -  person Mark Ransom    schedule 14.02.2012


Ответы (4)


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

No.

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

person Bo Persson    schedule 14.02.2012

В C ++ нет возможности отказаться от использования. В этом случае я могу думать только о следующих вариантах:

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

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

person Mark B    schedule 14.02.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 вместо глобального пространства имен.

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

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

person aalpern    schedule 14.02.2012
comment
-1 (ну, не совсем, но мне действительно стоит). Это будет работать только для библиотек только для заголовков. Если библиотека поставляется с заголовком и двоичным файлом, это объявит символы в неправильном пространстве имен и не сможет связать. - person David Rodríguez - dribeas; 14.02.2012
comment
Хорошая точка зрения. Я очень привык к библиотекам только для заголовков (и к более динамическим средам, которые без проблем поддерживают простой псевдоним). Отредактировал свой ответ, чтобы включить вашу точку зрения. - person aalpern; 14.02.2012

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

namespace myShield {
    #include "problematicheader.h"
}

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

person José Manuel    schedule 14.02.2012
comment
-1 (ну, не совсем, но мне действительно стоит). Это будет работать только для библиотек только для заголовков. Если библиотека поставляется с заголовком и двоичным файлом, это объявит символы в неправильном пространстве имен и не сможет связать. - person David Rodríguez - dribeas; 14.02.2012