2017-10-19 89 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,好的,但對象B是用不同的命名空間創建的嗎? – Bahubali

+0

不,'B'是'main()'中的局部變量。它不在名稱空間中。做'NS1 :: B'不正確 – vu1p3n0x

回答

3

命名空間只包含什麼被宣佈在他們裏面,你的情況這兩個類Base。然而,名爲B的這兩個對象並未在任何名稱空間中聲明(但都是函數main的作用域),因此會出現衝突的聲明錯誤。在不同的名稱空間中聲明的關聯類無關緊要。

+0

'B'聲明沒有在全局命名空間或全局範圍中聲明(如果它們被定義在main的上面),它們的作用範圍爲 – vu1p3n0x

+0

@ vu1p3n0x你說得對,我應該更多小心。請給我一分鐘的時間來弄清楚如何正確表達這一點。 – Knoep

+0

@ vu1p3n0x那該怎麼辦?我真的不確定,正確的術語是什麼。 – Knoep