2013-10-07 84 views
1

我遇到了使用類型別名和嵌套類/作用域的奇怪問題。下面的代碼是通過愉快3.3鐺接受,但拒絕nuwen MinGW的4.8.1:使用類型別名與嵌套類

template<typename T> 
struct container 
{ 
}; 

struct Outer 
{ 
    using type_t = int; 
    struct Inner 
    { 
     using container_t = container<type_t>; 
     using type_t = Outer::type_t; //error in MinGW 
    }; 
}; 

所產生的用gcc錯誤:http://ideone.com/cba6Fp(在我的系統相匹配的錯誤)

要修復該錯誤MinGW,你只需將container_t的定義移動到type_t(這是有道理的,而且本來應該是我原來所做的) - 但是我的問題是爲什麼它會用clang而不是MinGW編譯?代碼是否有效?

回答

2

的問題是在3.3.7/1 [basic.scope.class]:

2)的名稱N的一個S類使用的,應當是指相同的聲明在其上下文和重新當在完成的S範圍內進行評估。違反此規則不需要診斷。

您在Inner使用名稱type_t,但Inner::type_t聲明之前。所以這個名字是指兩個不同的聲明,違反了規則。

不需要診斷,所以鏗鏘在技術上不是不合格,但在這裏會出現錯誤。

+0

我不知道有些違規行爲不需要診斷 - 還有多少其他「隱藏的錯誤」是這樣的? –

+0

@ LB--標準草案中有23個「需要診斷」的字樣。 – TemplateRex