2017-08-18 5 views
5

using namespaceのような構造で、インポートされたシンボルが名前空間の本文(または本文)の外側に見えませんか?C++は外部からアクセス可能にせずに他の名前空間のシンボルを使用します

この例では、whateverother_namespaceのすべてのシンボルには、Foo::<name_of_symbol>でもアクセスできます。そのようなことが起こらないようにしたいと思います。

namespace Foo { 
    using namespace whatever; 
    using namespace other_namespace; 
    // some definitions 
} 

完全な例として、このプログラムは有効です。目的のセマンティクスを持つusing namespaceの代替品が存在し、使用された場合、それはそうではありません。

namespace a { 
    int func(int x) { 
    return 10; 
    } 
} 

namespace b { 
    using namespace a; 
} 

namespace c { 
    int do_thing(int x) { 
    return b::func(57); 
    } 
} 
+0

関数スコープの 'using'宣言? – Sneftel

+0

@Sneftel私は、すべての関数が同じ名前空間のセットを使用していて、恐れがあると感じています。 –

+1

また、不要な 'using namespace'ディレクティブを.cppファイルまたはprivate .hファイルに分離することもできますそれは消費コードには見えません。 –

答えて

5

名前の付いていない名前空間内でエイリアスを使用できます。

namespace a_long_namespace_name { 
    void someFunc() {}; 
} 

namespace b { 
    namespace { // an unnamed namespace 
     namespace a = a_long_namespace_name; // create a short alias 
    } 

    void someOtherFunc() { 
     a::someFunc(); 
    } 
} 

b::a::someFunc(); // compiler error 

関数を呼び出すために名前空間を記述する必要がありますが、呼び出しが短くなります。

関連する問題