web-dev-qa-db-ja.com

クラススコープ全体のC ++名前空間エイリアス

クラス宣言で名前空間エイリアスを使用できると期待していましたが、コンパイラの構文エラーが発生しました。

struct MyClass
{
    namespace abc = a_big_namespace;
    void fn() {
        abc::test();
    }
};

それを機能させる唯一の方法は、すべての関数にエイリアスを配置することです。

void fn() {
    namespace abc = a_big_namespace;
    abc::test();
}

さらに、関数パラメーターのエイリアスを使用できるようにしたいと思います。そのための回避策は見つかりませんでした。

void fn(abc::testType tt) {
    abc::test(tt);
}

私がやりたいことをする方法はありますか?

編集:私の解決策

特定の問題に名前のない名前空間は必要なく、簡単にこれを実行できることがわかりました。

namespace myspace
{
    namespace abc = a_big_namespace;

    struct MyClass
    {
       void fn(abc::testType tt) {
          abc::test(tt);
       }
    };
}

私のエイリアス名前空間が参照している他のライブラリに切り替えるには、エイリアスを変更するだけです。このメソッドを使用すると、1つのファイルに同じクラスを2回入れて、そのたびに異なるライブラリを参照することもできます。ご協力ありがとうございます。

33
Ant

クラス定義の名前空間エイリアスは、言語仕様で指定されているように、illegalです。

名前空間スコープまたは関数スコープのonlyallowed

名前空間スコープでエイリアスを作成できます。しかし、それは他のファイルからも使用できる永続的なエイリアスになります。しかし、解決策は簡単です。unnamed名前空間を使用して、エイリアス(したがって大きな名前空間のすべてのシンボル)が他のファイルから見えないようにすることができます。これはそれができる方法です:

//MyFile.cpp
namespace myspace
{ 
    namespace   //this is unnamed namespace
    {
       namespace abc = a_big_namespace;     
    }
    struct MyClass 
    {
      void fn() 
      { 
         abc::test();  //don't worry, this will work!
      } 
    };
}

//OtherFile.cpp

myspace::abc::test(); //error - that means, prevention worked.

エイリアスは他のファイルからは見えません。 OtherFile.cppをコンパイルすると、GCC(4.5.0)は次のように述べています。

'myspace :: abc'は宣言されていません

これは、エイリアスabcMyFile.cppに表示されているonlyことを証明しています。 unnamed名前空間に感謝します。

デモ: http://www.ideone.com/2zyNI (ただし、OtherFileの概念は示されていません。ideone.comに複数のファイルを置くことはできません)

33
Nawaz

名前空間エイリアスのスコープはコードブロックです。

したがって、任意のコードブロックに配置できます。

ただし、クラスのメンバーであることを意味するため、クラス内に配置することはできません。
名前空間エイリアスをメンバーにすることはできません。

名前空間エイリアスの詳細:

C++の名前空間エイリアスのスコープは何ですか?
名前空間

1
Yochai Timmer

構造体の外部でエイリアスを宣言すると機能します。

0
Björn Pollex

もちろん、エイリアスを配置することもできますoutsideクラス:

namespace abc = a_big_namespace;     

struct MyClass {
    void fn()
    { abc::test(); } 
}; 
0
Bo Persson