2012-02-28 3 views
7

は、私はこのコードを見て:STLPORT:名前空間std {}は何を意味していますか? STLportのライブラリで

namespace std { } 
namespace __std_alias = std; 

1.彼らは、最初の行に標準std名前空間を無効にしようとしていますか?
2.なぜ元の名前の代わりに長いエイリアス名を使用するのですか?

+5

'namespace std {}'は 'std'を無効にしません。ただそれには何も追加しません:)そしてもちろん、その名前をスコープに持ち込みます。 –

+0

これはファイルのスコープに入れるだけで、名前空間の内容は変わりません。中括弧 '{}'はそこに存在するためだけにあります。名前空間に何も追加することも、何も取り除くこともありません。ありがとう! – Nav

答えて

8

エイリアスを宣言する前に、 "スコープ内の"名前空間が必要です。空のnamespace std {}は、ネームスペースが存在することをコンパイラーに通知します。次に、エイリアスを作成することができます。

ショートカットの作成以外にエイリアスを作成する理由があります。たとえば、名前空間の名前を変更するマクロを定義すると、#define std STLPORT_stdの効果が考えられます。エイリアスを使用すると、ヘッダーファイルを使用して正しい注文ゲームをプレイするという条件で、元の名前空間にアクセスできます。

3
  1. いいえ、名前空間の名前が現在のスコープで使用できることを確認しています。ネームスペースの内容に影響を与えずに、いつでもネームスペースを開いたり閉じることができます。

  2. ::std以外の名前空間になるようにライブラリの実装を簡単に変更することができます(__std_aliasを別名に変更する)。これは、たとえば、2つの実装をお互いにテストしたい場合などに便利です。 D.Shawleyが言ったことに加えて

0

、前方名前空間内のクラスを宣言すると、同じ構文が必要です:

namespace std 
{ 
    template <typename T> 
    class vector; 
} 
+0

あなたの例で問題が発生するのは、ベクトルに2番目のパラメータ、つまりアロケータがあることです。この前方宣言により、後で問題が発生する可能性があります。 – CashCow

+0

私はベクトルが最高の例ではないことに同意します、私はただ知りたいと思っていただけです:) –

2

全くそのようなものが存在しないことをコンパイラエラーを取得するにはかなり迷惑ですコンパイラは何を考えていますか?もちろん存在します!

そうですが、ライブラリの機能と同様に、最初に宣言する必要があります。それが最初の行がやっていることです。

__std_aliasの名前を変更すると、名前空間に新しいエイリアスを付けることができます。あなたはいつか自分のコードでこれを行うことに決めました。

おそらく、あなたのコードでshared_ptrを使いたいかもしれませんが、あなたのコードをnamespace boostまたはstdを使って専用したくないかもしれません。エイリアスを作成して、ブーストまたはスタンダードのいずれかで「ポイント」することができます。後で標準になるブーストライブラリにある他の機能と同じです。

これは、複数のエイリアスを持つことができるため、すべての場合にこの名前空間を使用することに結びついておらず、複数の同じ名前空間を指し示すことができます。

スマートポインタライブラリsmlを呼び出すとしましょう。我々は、コード(同じヘッダ)にその時点から一つのコード内の場所と#include <boost/shared_ptr.hpp>

namespace sml = boost; // or std 

を行うことができます。

他のすべてのコードでは、sml::shared_ptrを使用しています。 boostからstdに切り替える場合は、すべてのコードではなくヘッダーを1つだけ変更してください。

関連する問題