using
名前空間に宣言を含めると、どのようなエラーが発生する可能性があるかを理解しようとしています。これらの リンクを考慮しています。
using
宣言の使用により、名前が別のファイルの前にロードされているヘッダー ファイルに静かに置き換えられることによってエラーが発生する例を作成しようとしています。
ここで私は定義していMyProject::vector
ます:
// base.h
#ifndef BASE_H
#define BASE_H
namespace MyProject
{
class vector {};
}
#endif
これは「悪い」ヘッダーです: ここでは、 insideusing
の他の可能な定義を隠すようにだまそうとしています:vector
MyNamespace
// x.h
#ifndef X_H
#define X_H
#include <vector>
namespace MyProject
{
// With this everything compiles with no error!
//using namespace std;
// With this compilation breaks!
using std::vector;
}
#endif
MyProject::vector
これは、で定義されているように使用しようとしている無防備なヘッダーbase.h
です。
// z.h
#ifndef Z_H
#define Z_H
#include "base.h"
namespace MyProject
{
void useVector()
{
const vector v;
}
}
#endif
x.h
最後に、 と の両方を含む実装ファイルを次に示しますz.h
。
// main.cpp
// If I swap these two, program compiles!
#include "x.h"
#include "z.h"
int main()
{
MyProject::useVector();
}
inをインクルードusing std::vector
すると、実際のコンパイル エラーが発生し、 inx.h
を使用するときにテンプレート引数を指定する必要があることが通知されます。これは、ヘッダー ファイルで宣言を使用してはならない理由の良い例ですか、それともこれよりも深く、もっと多くのことを見逃していますか?vector
z.h
x.h
vector
MyProject
using
ただし、に含めるusing namespace std
とx.h
、シャドウイングは発生せず、プログラムは問題なくコンパイルされます。何故ですか?を含むのusing namespace std
下に表示されているすべての名前をロードして、他の名前を隠してはいけませんか?std
vector