2012-02-14 7 views
2

2つの非常に大きなC++ライブラリを使用して自分自身のライブラリとアプリケーションセットを作成しようとしていますが、両方のライブラリのメインヘッダクラスにディレクティブがあります。この競合は、vector(std :: vector)と呼ばれる単一のクラスにあります。 1つのヘッダーに "using namespace std"があり、これは事態を混乱させます。名前空間が2つの大きなライブラリと衝突する

「名前空間を使用する」が既に書かれている後に、名前空間から識別子を除外する方法はありますか?

+10

**ヘッダー**に 'namespace std'を書くことは、間違いです。私は真剣にライブラリの残りの部分の品質を疑うだろう。 – dasblinkenlight

+3

これはヘッダーで決して '使用するべきではありません。ライブラリ作成者はコードを修正する必要があります。 –

+0

:)私はそれらのライブラリを書いていませんでした。私は全体(より小さい)ライブラリを編集してstd ::を導入すべきですか?これは道のりですか? – tmaric

答えて

2

ワームを缶に戻す方法はありますか?

最良のオプションは使用してディレクティブでヘッダを修正することです。それを削除し、宣言に必要な接頭辞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 

ヘッダは明らかにまだ使用して文を持っていますが、今では代わりにbrokenlib名前空間にstdからシンボルを注入しますグローバル名前空間。

ライブラリには折り返しが必要なエントリポイントが多数ありません。

編集:DavidRodríguezが指摘しているように、これは、使用しているライブラリがヘッダーのみの場合にのみ有効です。唯一の真の解決策は、ライブラリを修正することです(彼らがオープンソースであることを望みますか?)

+0

-1(まあまあではありませんが、本当にすべきです)これはヘッダーのみのライブラリでのみ機能します。ライブラリにヘッダーとバイナリが付いている場合、これは間違った名前空間にシンボルを宣言し、リンクに失敗します。 –

+0

良い点。ヘッダーのみのライブラリ(これほど問題のない簡単なエイリアシングをサポートするよりダイナミックな環境)に慣れてきました。自分の答えを編集してあなたのポイントを追加しました。 – aalpern

2

C++で使用する方法はありません。この場合、考えられる唯一の選択肢は次のとおりです。

  • ライブラリライターがライブラリを修正しましたか。ヘッダー内のusingは、ライブラリ内のバグを修正する必要があります。

  • 完全に区画化された個別の実装ファイルを使用して、アプリケーション内で2つのライブラリを完全に分離します。 2つのライブラリが通信する必要がある場合は、それらを一緒に接着するためにコードに何らかの種類のメディエータを作成する必要があります。