1

using名前空間に宣言を含めると、どのようなエラーが発生する可能性があるかを理解しようとしています。これらの リンクを考慮しています。

using宣言の使用により、名前が別のファイルの前にロードされているヘッダー ファイルに静かに置き換えられることによってエラーが発生する例を作成しようとしています。

ここで私は定義していMyProject::vectorます:

// base.h
#ifndef BASE_H
#define BASE_H

namespace MyProject
{
    class vector {};
}

#endif

これは「悪い」ヘッダーです: ここでは、 insideusingの他の可能な定義を隠すようにだまそうとしています:vectorMyNamespace

// 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を使用するときにテンプレート引数を指定する必要があることが通知されます。これは、ヘッダー ファイルで宣言を使用してはならない理由の良い例ですか、それともこれよりも深く、もっと多くのことを見逃していますか?vectorz.hx.hvectorMyProjectusing

ただし、に含めるusing namespace stdx.h、シャドウイングは発生せず、プログラムは問題なくコンパイルされます。何故ですか?を含むのusing namespace std下に表示されているすべての名前をロードして、他の名前を隠してはいけませんか?stdvector

4

1 に答える 1

1

ただし、xh に名前空間 std を使用することを含めると、シャドーイングは発生せず、プログラムは問題なくコンパイルされます。何故ですか?

7.3.4/2-3からこれだけ答えることができます:

初め

using-directive は、指定された名前空間の名前が、using-directive の後に using-directive が現れるスコープで使用できることを指定します。

その後、フォローアップしました:

using ディレクティブは、それが表示される宣言領域にメンバーを追加しません。

したがって、using-directive ( using namespace) は、名前をターゲット名前空間から使用できるようにするだけで、名前をそのメンバーにはしません。したがって、既存のメンバーは、使用されている名前空間メンバーよりも優先されます。

于 2016-10-03T14:22:16.993 に答える