2011-12-06 51 views
4

以下代碼是否合法? MSVC 9和g ++ 4.4不以爲然:派生類型可以與其基類的嵌套類型具有相同的名稱嗎?

struct base 
{ 
    struct derived {}; 
}; 

struct derived : base {}; 

int main() 
{ 
    typedef derived::derived type; 
    return 0; 
} 

MSVC抱怨,該類型的構造函數混淆了嵌套名稱:

c:\dev>cl test.cpp 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

test.cpp 
test.cpp(10) : error C2146: syntax error : missing ';' before identifier 'type' 
test.cpp(10) : error C2761: '{ctor}' : member function redeclaration not allowed 

test.cpp(10) : error C2065: 'type' : undeclared identifier 

雖然G ++並不:

$ g++ --version test.cpp 
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 
Copyright (C) 2010 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

對於情況下,我的代碼包含一個名爲pointer的迭代器。爲了提供迭代器接口,它提供了嵌套類型pointer,這是它自己的同義詞。

+0

我相信'''typename'''是違法的非模板代碼,或者至少一些編譯器抱怨關於它。 –

+0

試一試'typedef typename derived :: derived type;'並查看它是否有效。 –

+0

對不起,我誤解了你的代碼。順便說一句,對於Comeau,你的代碼是非法的(有或沒有'typename'),所以我傾向於認爲VC++就在這裏。 –

回答

3

Comeau認爲你的代碼是不正確的,所以我覺得構造演繹陰影類型,解釋是什麼標準規定。

而且,你的代碼編譯愉快,如果你明確了不確定性,並告訴你要訪問的基類的derived成員編譯:

struct base 
{ 
    struct derived {}; 
}; 

struct derived : base {}; 

int main() 
{ 
    typedef derived::base::derived type; 
    return 0; 
} 

順便說一句,一個事實,即構造函數解釋盛行有點有道理:你有一個衆所周知的方式告訴編譯器你想引用基類的東西(通過作用域解析運算符),但是你不會有語法來做相反的事情(迫使編譯器明白你指的是構造函數)。所以「默認構造器」行爲看起來很合理。


  1. 我以後可能會看它,但我不保證我居然會,這種討厭的名字的問題總是一團糟查找。
+0

謝謝!不幸的是,'''std :: iterator_traits'''窒息了。我想我會專門化它。 –

+0

@JaredHoberock:你究竟在做什麼? –

+0

我有一個指針包裝器,'''指針'',它來自boost :: iterator_adaptor'''。指針包裝器在類型系統中編碼元數據。 –

0

你有什麼是在名稱中的混合。 只需將第二個結構重命名爲struct derived2即可。 而在main()做到這一點變化也:typedef derived2::derived type; 能順利完成編譯在VC++ 6.0

struct base 
{ 
    struct derived {}; 
}; 

struct derived2 : base {}; 


int main() 
{ 
    typedef derived2::derived type; 
    return 0; 
} 
+0

我不會檢查一些與VC++ 6.0標準一致的代碼:S –

相關問題