2011-07-25 37 views
2

根據這個鏈接幫助澄清我對不合格的名稱查找疑問:ISO n3290草案

A point from C++0x draft : n3290

應在本計劃是正確的嗎?

EX: 
namespace X {}; 
enum Foo 
    { 
     X = 0,  #1 
     Y, 
     Z = X // X refers to the enum, not the type 
    }; 

蔭得到錯誤而執行這一計劃像//#1「X」重新聲明爲不同意義的符號

但在上述聲明鏈接...含枚舉符命名空間範圍。 ...等

請澄清我的疑問。

否則請任何人給我,證明上述聲明(連結)的例子有命名空間

回答

1

有在原來的問題了struct X代替namespace X的差異。命名空間的名字在這個範圍內是可見的,Foo :: X也是如此,因爲枚舉名稱「泄漏」到周圍的命名空間中。這會產生衝突。

在C中(因此也在C++中),struct/class/union的名稱位於單獨的「標記名稱空間」(具有不同含義的C術語)中,它允許我們使用相同的名稱聲明另一個項目在同一個範圍:

Difference between 'struct' and 'typedef struct' in C++?

+0

但是對於Struct X示例,它不會根據上述ISO語句創建衝突。但是對於名稱空間而言,它不起作用...我可能知道原因...爲什麼?請解釋一下 – user751747

+0

我以爲我做到了。 :-)通過聲明一個結構,你可以隱藏名字。無論如何,你可以通過編寫'struct X'來獲得結構體。這是從C繼承的。命名空間是一個C++特性,工作方式不同。 –

0

該計劃是非法的。一個enum不引入一個單獨的範圍 (除非你使用C++ 11 添加class到它),無論是 命名空間X和枚舉常數X處於相同的範圍內。 只有兩種情況可以在相同範圍內定義超過 的同一名稱:重載函數和一個類名。類名的 特殊情況純粹是爲了與C兼容,使 C API與類似的功能:

struct stat { ... }; 
int stat(const char* path, struct stat* buf); 

不會打破。如果同時存在類名和其他名稱,則其他名稱優先,除非在類關鍵字之前。

+0

請注意,在C++ 11中,您不需要enum類來讓枚舉器具有範圍。它們總是具有枚舉名稱的範圍(假設它們具有枚舉名稱)。但是,爲了向後兼容,他們保留了舊的範圍。所以'Y'和'Foo :: Y'在C++ 11中都是合法的。 –