31

を使用using namespaceすると、名前空間修飾子を使用せずに、その名前空間のコンテンツ全体を直接表示できます。これは、広く使用されているヘッダーで発生した場合に問題を引き起こす可能性がありusing namespaceます。同じクラス名を持つ2つの名前空間を意図せずに表示する可能性があり、クラス名の前に名前空間修飾子が付いていない限り、コンパイラはコンパイルを拒否します。

using namespaceコンパイラが以前に見たことを忘れるように元に戻すことはできますか?

4

6 に答える 6

38

usingいいえ。ただし、ヘッダーにディレクティブや宣言を含めるべきではないことを同僚に伝えることができます。

于 2010-01-28T07:28:11.397 に答える
16

他の人が言ったように、あなたはそうすることができず、問題はそもそもそこにあるべきではありません。
次善の策は、必要な記号を取り込んで、名前の検索で優先されるようにすることです。

namespace A { class C {}; }
namespace B { class C {}; }
using namespace A;
using namespace B;

namespace D {
    using A::C; // fixes ambiguity
    C c;
}

場合によっては、問題のあるインクルードを名前空間でラップすることもできます。

namespace offender {
#  include "offender.h"
}
于 2010-01-28T07:33:36.863 に答える
6

いいえ、C++Standardは「元に戻す」については何も述べていません。許可されている最善の方法は、次の範囲を制限することですusing

#include <vector>

namespace Ximpl {

using namespace std;    
vector<int> x;

}

vector<int> z; // error. should be std::vector<int>

ただし、残念ながら、名前空間using namespace Ximplからもすべての名前が取得されます。std

于 2010-01-28T07:46:36.880 に答える
3

私の知る限りではありません...しかし、原則として、私は.cppファイルで「名前空間の使用」のみを使用します。

于 2010-01-28T07:27:06.173 に答える
0

ヘッダーファイルで使用しようとする最も近いものは次のとおりです。

//example.h

#ifndef EXAMPLE_H_
#define EXAMPLE_H_


/**
 * hating c++ for not having "undo" of using namespace xx
 */
#define string std::string
#define map std::map

class Example {
public:
    Example (const char *filename);
    Example (string filename);
    ~Example ();
private:
    map<string,complicated_stuff*> my_complicated_map;

};

#undef string
#undef map

#endif //EXAMPLE_H_

結局のところ、defineは#undef可能です。2つの問題があります:1。それは醜いです2.対応する名前空間からの名前ごとに別々の#defineと#undefが使用されます

于 2013-12-13T08:35:14.347 に答える
0

述べたようusing namespace sthに、ヘッダーファイルでは使用しないでください。実装で名前空間の機能が必要な場合は、次のようなスコープを活用できます。

void func() {
    // some code agnostic to your namespace.
    {
        using namespace sth;
        // some code aware of sth.
    }
    // some other code agnostic to your namespace.
}
于 2022-03-06T04:41:27.830 に答える