2010-05-06 71 views
2

我們發現了類似下面的內容(不要問...):全球資格

namespace N { 
    struct A { struct B; }; 
} 

struct A { struct B; }; 

using namespace N; 

struct ::A::B {}; // <- point of interest 

有趣的是,該編譯罰款與VS2005,ICC 11.1和科莫(在線),但失敗並GCC:

類名的全球資格是無效之前, '{' 令牌

從C++ 03,附件A,它似乎對我來說,GCC是正確的:

  • class-head可以由nested-name-specifieridentifier
  • nested-name-specifier不能以全球資格(::
  • 開始明顯,既不可以identifier

...還是我俯瞰什麼?

+0

聽起來像VS2005課程的標準。 – wheaties 2010-05-06 13:19:03

回答

6

我認爲你的判斷正確:在這種情況下GCC實現了標準的信件,而其他標準實施它不太嚴格(看看issue #355)。

你可以做下面的工作,周圍的語法

struct identity<::A>::type::B {}; 

的限制,或者你用一個明確的命名typedef

typedef ::A AHidden; 
struct AHidden::B { }; 

或者,當然了,你交換的using namespace順序和嵌套的類定義。請注意,附錄A僅供參考。規範性文本在條款5.1/79

+0

謝謝,提示和我需要的所有:) – 2010-05-06 14:00:51

+0

完美! :)...... – 2010-05-06 14:18:53