2015-02-10 88 views
-3

我有以下代碼:類型名稱路徑是由一個靜態變量隱藏

struct type1 
{ 
    struct type2 
    { 

    }; 
    int tyep2; // No conflic with real type name path: type1::type2 
}; 

struct type4 
{ 
    struct type5 
    { 

    }; 
    static int type5; // No conflic with real type name path: type4::type5 

}; 

int type4::type5; // this path name is equal to type name path: struct type4::type5 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    type1::type2 var1; // is ok 
    type4::type5 Var2; // is ok 
    type4::type5 = 0; // is ok, but the static variable has obscured my type 
    return 0; 
} 

我的問題是:

  1. 爲什麼靜態變量成的Type5隱藏式 type4 :: type5
  2. 爲什麼編譯呃當我聲明type5時不會產生錯誤變量?
  3. 在哪裏可以閱讀有關C++標準規範中的這種行爲?請發表最終的提取物
+0

對不起,我發佈了一個錯誤代碼 – AngeloDM 2015-02-10 21:54:54

+0

爲什麼你說「靜態變量已經模糊了你的類型」? – 2015-02-10 22:56:38

回答

2

你的程序是形成不良的,因爲名字不確定性(忽略拼寫錯誤「tyep的「你已經散落)

§10.2會員名稱查找

成員名稱查找確定類範圍(3.3.7)中名稱(id-expression)的含義。名稱 查找可能會導致模糊,在這種情況下,該程序不合格。對於id表達式,名稱 的查找從此類的範圍開始;對於合格id,名稱查找從嵌套名稱 說明符的範圍開始。名稱查找發生在訪問控制之前(3.4,第11章)。

不要這樣做:

struct type5 
{ 
    //... 
}; 
static int type5; 

毫不奇怪,這並不編譯我的ideone。 Live Demo

+0

感謝您的評論和發佈。 我不明白爲什麼我糾正我的代碼後收到負面評論。 – AngeloDM 2015-02-10 22:17:02

+0

@AngeloDM:我的猜測是因爲你的問題無疑是初學程序員學習的東西;不要給兩個同名的東西。您特別要求在標準中提及,所以我回答了這個問題,但這個想法是我不應該需要。 – AndyG 2015-02-10 22:28:25

0

1)T YE P5!=成的Type5

2)同樣的原因

+0

對不起,我發佈了一個錯誤代碼 – AngeloDM 2015-02-10 21:55:10