C ++では、「名前空間エイリアス」とは何ですか?


回答:


186

名前空間エイリアスは、長い名前空間名を別の短い名前で参照する便利な方法です。

例として、using namespaceディレクティブなしでBoostのuBLASからの数値ベクトルを使用したいとします。名前空間全体を毎回述べるのは面倒です。

boost::numeric::ublas::vector<double> v;

代わりに、エイリアスを定義できます。boost::numeric::ublasこれを単にublas次のように短縮したいとします。

namespace ublas = boost::numeric::ublas;


ublas::vector<double> v;

7
おそらく反対投票を説明するために、SOは良いC ++教科書に取って代わるものではなく、今後もそうなることはありません。あなたが提起した質問は、そのような本で答えられます。そして、あなた自身の質問に答えるSOの「特徴」は、そのような本の言い換えを提供するために使用されるべきではありません。

24
違反はありませんでした...なぜ私がこれをしたのかを説明するだけです:ポッドキャストのJoelのコメントから、「エントリーレベル」の質問でさえSOの公正なゲームであり、質問してそれに答えることは受け入れられるという理解でしたそのコンテンツがSOにまだない場合は、自分自身でアクセス可能な形式にしています。しかし、どうやら、これは眉をひそめていますか?
マーティンB

1
刺激を避けるために、あなた自身の質問に答えるエチケットは確かにあります。この場合、それが本当の質問ではなかったこと明らかです。たとえば、stackoverflow.com
questions / 494927 /…

6
@Martin B:これはエントリーレベルの質問であることに同意しません。実際、過去に多くの票を投じて、はるかに明白な質問が寄せられています。そうは言っても、人々はあなたが単に自分のための評判を得ようとしていると感じているかもしれません。これを回避する方法は、質問/回答の一方または両方を「コミュニティwiki」としてマークすることです。個人的に私はあなたとして質問に行き、コミュニティとして答えます。質問にメリットがある場合、ROIが得られます。
リチャードコーデン

1
重要な質問は本当かどうかだと思います」-それはあなたが尋ねられたものですか?それは人々が知りたいものですか?それはまだ尋ねられておらず、SOで答えられていないものですか? Rコミュニティの投稿とここでの質問への回答に関するSOブログの投稿。コミュニティが実際に質問し続けた上位Xの質問を選んだため、現実世界との関連性があったことに注意してください。あまり役に立たない
jalf

7

簡単に言うと、#defineは機能しません。

namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }

正常にコンパイルします。名前空間/クラス名の衝突を回避できます。

namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }

最後の行の "Hmm:Oops"はコンパイルエラーです。プリプロセッサーはそれをNope :: Oopsに変更しますが、Nopeはすでにクラス名です。


3
#define?おそらくあなたの答えは質問の以前のバージョンを参照していますか?
einpoklum 2016

3

このトピックの詳細http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

次のような、名前空間の名前のエイリアスを選択することがすべてです。

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

その後、あなたはtypedefすることができます

typedef SHORT::mytype

の代わりに

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

この構文は名前空間でのみ機能し、クラス、型の後に含めることはできません namespace NAME =


3

また、名前空間のエイリアスとusingディレクティブは、実行時ではなくコンパイル時に解決されることにも注意してください。(より具体的には、どちらも、現在のスコープまたはその親スコープのいずれかに特定のシンボルが見つからない場合に、名前を解決するときに他に探す場所をコンパイラーに指示するために使用されるツールです。)たとえば、これらのどちらもコンパイル:

namespace A {
    int foo;
    namespace AA {
        int bar;
    } // namespace AA
    namespace AB {
        int bar;
    } // namespace AB
} // namespace A
namespace B {
    int foo;
    namespace BA {
        int bar;
    } // namespace BA
    namespace BB {
        int bar;
    } // namespace BB
} // namespace B

bool nsChooser1, nsChooser2;
// ...

// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;

// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
    if (nsChooser2)
        using namespace A::AA;
    else
        using namespace A::AB;
else
    if (nsChooser2)
        using namespace B::BA;
    else
        using namespace B::BB;

さて、好奇心旺盛な人は、constexpr変数がコンパイル時にも使用されることに気づき、それらがエイリアスまたはディレクティブのいずれかと組み合わせて使用​​できるかどうか疑問に思っているかもしれません。私の知る限り、私はこれについて間違っているかもしれませんが、彼らはできません。異なる名前空間で同じ名前の変数を使用して動的に選択する必要がある場合は、参照またはポインタを使用する必要があります。

// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);

int* bar;
if (nsChooser1) {
    if (nsChooser2) {
        bar = &A::AA::bar;
    } else {
        bar = &A::AB::bar;
    }
} else {
    if (nsChooser2) {
        bar = &B::BA::bar;
    } else {
        bar = &B::BB::bar;
    }
}

上記の有用性は限られているかもしれませんが、それは目的を果たすはずです。

(上記で見逃したかもしれないタイプミスについての私の謝罪)


0

名前空間は、名前の競合を防ぐために使用されます。

例えば:

namespace foo {
    class bar {
        //define it
    };
}

namespace baz {
    class bar {
        // define it
    };
}

これで、名前空間のおかげで、2つのクラスの名前バーが完全に異なり、別々になりました。

表示する「using namespace」は、そのネームスペース内のクラスを使用するためにネームスペースを指定する必要がないようにするためのものです。つまり、std :: stringはstringになります。

私のリソース:https : //www.quora.com/What-is-namespace-in-C++-1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.