2011-01-04 16 views
2

C++に関する書籍を読むたびに、「using namespace std」の例が見つかります。'std'以外のC++で役に立つ名前空間

他の名前空間がC++に存在するかどうか知りたいのですが、これは便利ですか?

+14

これらの書籍を焼く。 –

答えて

12

boost
std::tr1。 (テクニカルレポート1)

しかし、using namespace std;は、特にヘッダーファイルには適していません。それはあなたがそれを使うたびに5つの余分な文字です、はるかに明確なコードと少ない衝突のために。

5

C++標準ライブラリのすべては、std名前空間(またはstdのネストされた名前空間)にあります。

他のライブラリはもちろん、他の名前空間を使用しています。使用している他のライブラリのドキュメントを参照して、使用するネームスペースを判断することをお勧めします。

これは、ディレクティブの使用は一般的に悪い考えです。名前空間の個々の名前を使用する宣言を使用する方がはるかに優れています。これは、std名前空間で特に重要です。 std名前空間にはよく使われる名前が多くあり、自分の関数やクラスを参照したり、誤って標準ライブラリの関数やクラスを参照しようとすると、解決しにくい問題にぶつかりやすいです。たとえば、これは悪いです:

using namespace std; 
cout << "Hello world" << endl; 

はこれが優れている:あなたは、あなたのプログラム全体で完全修飾名を使用するときに私の意見で

using std::cout; 
using std::endl; 
cout << "Hello world" << endl; 

、コードは通常クリーナーです。これは、それが明確エンティティから来て、ミスにはあまり余地を残している場所を行います。std::bindを使用している場合たとえば、それはstd::placeholders::_1を使用するように鼓動(もちろん、これらの規則のすべての例外は、

std::cout << "Hello world" << std::endl; 

ありますしますし、その友人。それusingディレクティブは、関数の内部では、しかし、ではない名前空間スコープであるべきなどusing std::placeholders;を使用して、ちょうど_1を参照するコード、_2を、読み取ることがはるかに簡単です。)

+0

最後のコメントは無視してください。(Bill、 'namespace po = boost :: program_options'ではなく' namespace po = boost :: program_options'です) –

0

これはの名前空間でありますC++標準ライブラリ。 AFAIKこれはあなたが「すぐに使える」唯一の名前空間です。あなたが自分で定義しなければならない他のものや、他のライブラリからそれらを得ることができます。

0

C++標準ライブラリのすべてのファイルは、std名前空間内のすべてのエンティティを宣言します。サードパーティのライブラリ(boostなど)を使用している場合や、独自の名前空間を定義している場合にのみ、他の名前空間に遭遇します。

2

std::rel_ops名前空間に言及した人はいません。それはoperator!=,operator>,operator<=およびoperator>=を定義します。

あなたは、使用するディレクティブまたは宣言でスコープ内にそれらを持ってきて、あなたのタイプにoperator<operator==を定義することができます。 std::rel_opsによって提供される演算子は、これら2つの点で動作します。

関連する問題