2012-02-14 4 views
2

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

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

+10

Написание 'использование пространства имен std' в вашем ** заголовке ** является ошибкой капитала. Я бы серьезно сомневался в качестве остальной библиотеки. – dasblinkenlight

+3

И поэтому никогда нельзя «использовать» в заголовке. Библиотечным писателям необходимо исправить свой код. –

+0

:) Я не писал эти библиотеки. Должен ли я затем редактировать всю (меньшую) библиотеку и вводить std ::? Это путь? – tmaric

ответ

2

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

No.

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

0

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

namespace myShield { 
    #include "problematicheader.h" 
} 

EDIT: Только для заголовков только библиотек:/

+1

-1 (ну, не очень, но я действительно должен) Это будет работать только для библиотек только для заголовков. Если в библиотеке есть заголовок и двоичный файл, это будет объявлять символы в неправильном пространстве имен и не будет связываться. –

1

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

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

#ifndef MY_WRAPPER_HEADER_H 
#define MY_WRAPPER_HEADER_H 1 

namespace brokenlib 
{ 
#include <brokenlib.h> 
} 

#endif 

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

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

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

+0

-1 (ну, не совсем, но я действительно должен) Это будет работать только для библиотек только для заголовков. Если в библиотеке есть заголовок и двоичный файл, это будет объявлять символы в неправильном пространстве имен и не будет связываться. –

+0

Хорошая точка. Я очень привык к библиотекам только для заголовков (и более динамичным средам, которые поддерживают легкое наложение псевдонимов без проблем, подобных этому). Отредактировал мой ответ, чтобы включить вашу точку. – aalpern

2

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^