2011-01-05 6 views
1

内の名前空間内のstdヘッダを含めることはできません。は、なぜ私たちは次のコードをg ++ 4.4でコンパイルエラーを引き起こしますC++

// File test.cpp 
namespace A 
{ 
    #include <iostream> 
} 

int main() 
{ 
    return 0; 
} 

一部のサードパーティのライブラリが保護名前空間なしで来るので、私はこの要件を持っています、これらのヘッダーを直接インクルードすると、私の名前空間が汚染されます。
その結果、これらのライブラリの名前空間を作成しようとしましたが、ライブラリにいくつかの「標準ヘッダー」が含まれていると、上記の方法は失敗します。

誰でも手伝いできますか?

ありがとうございました!

+0

STL(std)ヘッダーの名前空間の名前を変更しようとしているのですか、サードパーティのヘッダーにあるものを名前空間に移動しようとしていますか?件名とサンプルコードは前者を示していますが、説明は後者を示唆しています。 –

+0

@ Leo Davidson:第三者ヘッダーにあるものをネームスペースに移動したい – zJay

+0

@Le Davidson:サードパーティのヘッダーにあるものをネームスペースに入れたいと思うようですが、そのヘッダーには標準のlibヘッダーが含まれているためできません。私はあなた自身がヘッダーを編集するのに手間がかからないと思います。 –

答えて

6

Iは、名前空間内の標準ライブラリヘッダを含む17.4.2.1 [lib.using.headers]は禁止信じる:

翻訳単位のみ外部宣言または定義の外部ヘッダを含むもの、及び は、 翻訳単位で宣言または最初に定義するエンティティへの最初の参照の前に字句的にヘッダーを含めるものとします。

私は、図書館の著者に依頼する以外に何かできることはないと思います。

0

using namespace std;の代わりにstd::coutのような標準ライブラリへの呼び出しを使用する場合は、完全修飾名を使用してください。このようにして、どちらも共存することができます。

1

この方法は、おそらくトラブルにつながります。がネームスペースに入る前に、このような標準ヘッダーを手動で含めることで問題に近づくことができ、インクルードガードはネームスペース内のヘッダーを再組み入れないように扱います。

これは現在のエラーを処理しますが、一方では他の多くのものをブレークします。ライブラリがプリコンパイルされていれば、コードで使用されているシンボルとバイナリライブラリのシンボルは異なるシンボル(コードでlibname::foo()が使用され、バイナリで::foo()が定義されています)。ライブラリがヘッダーのみであっても、ライブラリ内のライブラリへの完全なアクセスは、(void foo() { ::bar(); }ここでfoobarがライブラリ内にあります)破損します。

迷惑で実際の作業が必要な場合でも試してみるとよいでしょう。独自の名前空間内にあるラッパーを書き込み、ライブラリを使用します。次に、実際のライブラリヘッダーの代わりにラッパーを組み込みます。

私の助言は、一方で、問題を完全に無視することです。あなたの名前空間内にあなた自身のオブジェクトを宣言すれば、名前の衝突が起こる可能性があります。あなたがusing namespaceステートメントから離れる限り、あなたは大丈夫でしょう。

関連する問題