2017-06-05 112 views
0

我不確定B類中的兩個數據成員聲明是否相同。C++標準默認命名空間

//file0.h 
namespace C 
{ 
    typedef int Id; 
} 
//file1.h 
namespace A 
{ 
    typedef int Id; 
} 

//file2.h 
namespace A 
{ 
    class B 
    { 
     public: 
     // ... 
     //Want to add data member theId as: 
     //Id theId; 
     //or 
     //A::Id theId; 
    } 
} 

即,在不存在A ::的,有C++標準使用在像這樣的情況下,默認名稱空間?例如,它可能默認爲名稱空間A,因爲該類正在其中聲明。

如果使用Id theId,它將使用哪個名稱空間,A還是C?

編輯1:註釋掉代碼以避免混淆。 編輯2:添加另一個「theId」與不同的命名空間來更好地說明問題。

+1

[合格名稱查找](http://en.cppreference.com/w/cpp/language/qualified_lookup)與[不合格名稱查找](HTTP://en.cppreference .COM/W/CPP /語言/ unqualified_lookup)。 – Jarod42

+0

代碼是否可以編譯? – Bernard

+0

所以在你的情況下它是相同的。 – Jarod42

回答

0

答案是Id結果在A :: Id theId。

爲什麼?

Id(沒有A::)是一個不合格的名稱。 C++則訴諸於該規則找到合適的編號:

成員函數定義成員函數 體,成員函數的默認參數,成員函數的異常規範 ,默認成員內部使用的名稱初始化,或嵌套 類定義(包括從該嵌套 類來源的鹼基的名稱),搜索的範圍是相同的類中定義 ,內部[...]

[類定義]搜索範圍如下:

d)如果此類 是一個命名空間的成員,或嵌套在一類是一個命名空間的成員 ,或者是在一個函數的局部類是 成員的命名空間,的範圍命名空間將被搜索,直到類的定義爲 ,包含類或函數。如果查找 對於由朋友聲明引入的名稱:在這種情況下僅包含 ,則考慮最內層的封閉名稱空間,否則查找 將像往常一樣繼續封裝名稱空間,直到全局範圍。

參考:http://en.cppreference.com/w/cpp/language/unqualified_lookup