1

usingの宣言を名前空間に含めると、どのような種類のエラーが発生するのか理解しようとしています。私はtheselinksを考慮に入れています。名前空間でのディレクティブの使用によるエラーの例

using宣言を使用しているため、名前が別のものよりも前に読み込まれるヘッダーファイルに置き換えられているためにエラーが発生する例を作成しようとしています。

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

// base.h 
#ifndef BASE_H 
#define BASE_H 

namespace MyProject 
{ 
    class vector {}; 
} 

#endif 

これは "悪い" ヘッダである:ここで私はMyNamespacevectorの他の可能な定義をシャドウイングに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.hz.hの両方を含む、です:

// main.cpp 
// If I swap these two, program compiles! 
#include "x.h" 
#include "z.h" 

int main() 
{ 
    MyProject::useVector(); 
} 

私はx.husing std::vectorが含まれている場合、実際のコンパイルエラーがでvectorを使用しているとき、私はテンプレート引数を指定しなければならないことを私に言って、たまたまx.hvectorMyProjectの定義をシャドーするのに成功したので、z.hです。これは、なぜusingの宣言をヘッダーファイルで使用すべきでないかの良い例ですか、これ以上深刻なことはありません。

using namespace stdx.hに含めると、シャドーイングは発生せず、プログラムはうまくコンパイルされます。何故ですか? using namespace stdstdの下に表示されるすべての名前をロードする必要があります(vectorなど)。

答えて

1

ただし、x.hに名前空間stdを使用すると、シャドウイング は発生せず、プログラムはうまくコンパイルされます。何故ですか?

これは非常に私は7.3.4/2-3から答えることができます。

まず

使用して、ディレクティブがノミネート名前空間 内の名前がスコープで使用できることを指定し

使用指示は の後に表示されます。

はその後フォローアップ:

を使用して、ディレクティブは、それが出現する宣言型地域 に任意のメンバーを追加しません。

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

+0

ありがとうございます!私はこの2つの使い方の違いを認識していませんでした。 – swahnee

関連する問題