using
の宣言を名前空間に含めると、どのような種類のエラーが発生するのか理解しようとしています。私はtheselinksを考慮に入れています。名前空間でのディレクティブの使用によるエラーの例
using
宣言を使用しているため、名前が別のものよりも前に読み込まれるヘッダーファイルに置き換えられているためにエラーが発生する例を作成しようとしています。
ここで私はMyProject::vector
を定義しています:
// base.h
#ifndef BASE_H
#define BASE_H
namespace MyProject
{
class vector {};
}
#endif
これは "悪い" ヘッダである:ここで私はMyNamespace
内vector
の他の可能な定義をシャドウイングにusing
を騙ししようとしている:
// 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
これは、base.h
で定義されたMyProject::vector
を使用しようとする疑いのないヘッダーです。
// 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();
}
私はx.h
でusing std::vector
が含まれている場合、実際のコンパイルエラーがでvector
を使用しているとき、私はテンプレート引数を指定しなければならないことを私に言って、たまたまx.h
はvector
MyProject
の定義をシャドーするのに成功したので、z.h
です。これは、なぜusing
の宣言をヘッダーファイルで使用すべきでないかの良い例ですか、これ以上深刻なことはありません。
using namespace std
をx.h
に含めると、シャドーイングは発生せず、プログラムはうまくコンパイルされます。何故ですか? using namespace std
std
の下に表示されるすべての名前をロードする必要があります(vector
など)。
ありがとうございます!私はこの2つの使い方の違いを認識していませんでした。 – swahnee