を使用using namespace
すると、名前空間修飾子を使用せずに、その名前空間のコンテンツ全体を直接表示できます。これは、広く使用されているヘッダーで発生した場合に問題を引き起こす可能性がありusing namespace
ます。同じクラス名を持つ2つの名前空間を意図せずに表示する可能性があり、クラス名の前に名前空間修飾子が付いていない限り、コンパイラはコンパイルを拒否します。
using namespace
コンパイラが以前に見たことを忘れるように元に戻すことはできますか?
を使用using namespace
すると、名前空間修飾子を使用せずに、その名前空間のコンテンツ全体を直接表示できます。これは、広く使用されているヘッダーで発生した場合に問題を引き起こす可能性がありusing namespace
ます。同じクラス名を持つ2つの名前空間を意図せずに表示する可能性があり、クラス名の前に名前空間修飾子が付いていない限り、コンパイラはコンパイルを拒否します。
using namespace
コンパイラが以前に見たことを忘れるように元に戻すことはできますか?
using
いいえ。ただし、ヘッダーにディレクティブや宣言を含めるべきではないことを同僚に伝えることができます。
他の人が言ったように、あなたはそうすることができず、問題はそもそもそこにあるべきではありません。
次善の策は、必要な記号を取り込んで、名前の検索で優先されるようにすることです。
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"
}
いいえ、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
私の知る限りではありません...しかし、原則として、私は.cppファイルで「名前空間の使用」のみを使用します。
ヘッダーファイルで使用しようとする最も近いものは次のとおりです。
//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が使用されます
述べたよう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.
}