2017-10-19 12 views
0

次のコードを実行することができません。ネームカードが異なるので、なぜ以下に述べるようにエラーを表示しているのですか? エラー: 'NS2 :: Base B'という競合する宣言 NS2 :: Base B;C++:名前空間の競合する宣言エラー

#include<iostream> 
using namespace std; 

namespace NS1 
{ 
    class Base 
    { 
     int x=4; 
     public: 
      void disp() 
      { 
       cout<<x<<endl; 
      } 
    }; 
} 

namespace NS2 
{ 
    class Base 
    { 
     int x=7; 
     public: 
      void disp() 
      { 
       cout<<x<<endl; 
      } 
    }; 
} 

int main() 
{ 
    NS1::Base B; 
    NS1:B.disp(); 
    NS2::Base B; 
    NS2::B.disp(); 
} 
+1

あなたは 'B'と呼ばれる変数を作成しています。これは名前空間とは関係ありません。 – Knoep

+0

@Knoep、Ok、でもオブジェクトBは異なる名前空間で作成されますか? – Bahubali

+0

いいえ、 'B'は' main() 'のローカル変数です。名前空間にはありません。 'NS1 :: B'を行うのは間違っています – vu1p3n0x

答えて

3

名前空間には、あなたの場合、二つのクラスBaseに、それらの中で宣言されたものだけが含まれています。しかし、Bと呼ばれる2つのオブジェクトは、いずれのネームスペースでも宣言されていません(ただし、両方とも関数mainにスコープされています)。したがって、矛盾する宣言エラーが発生します。関連するクラスが異なる名前空間で宣言されていても問題はありません。

+0

'B'宣言は、グローバル名前空間、またはグローバルスコープで宣言されていません(メインの上に定義されていれば)、 – vu1p3n0x

+0

@ vu1p3n0xのスコープになります。注意してください。これを正しく表現する方法を理解してください。 – Knoep

+0

@ vu1p3n0xそれはどう?私は本当によく分かりません。正しい用語は何ですか。 – Knoep

関連する問題