2012-01-28 52 views
2
訪問靜態字段

可能重複:通過使用decltype

#include <iostream> 

struct A 
{ 
    static const int v = 1; 
}; 

int main() 
{ 
    A a; 
    std::cout << decltype(a)::v << std::endl; 
} 

將產生下一個編譯錯誤::
C++0x decltype and the scope resolution operator

使用克++ 4.6.1編譯下一個例子

error: expected primary-expression before 'decltype' 
error: expected ';' before 'decltype' 

這是按照標準嗎?或者,這是g ++的怪癖嗎?

+0

如果您輸入了「A :: v」,它也會讓您免於更多打字:D – 2012-01-28 20:57:51

+1

@ Mr.Anubis:如果它是'std :: map > m ;自動a = m.begin();'....然後將寫入類型名而不是'decltype(a)'是一個儲蓄? – 2012-01-28 21:00:49

+0

@BenVoigt不是真的是一個騙局,我不喜歡這個問題的答案。我的問題的答案是在這個問題 – 2012-01-28 21:01:44

回答

1

它看起來好像編譯器不識別decltype關鍵字。

G ++ 4.6.1是新的,足以包含decltype關鍵字。您是否使用-std=gnu++0x-std=c++0x啓用C++ 11模式?

的C++語法確實允許一個decltype說明符合格-ID::之前出現,所以代碼將由一個符合編譯器被接受。錯誤消息是錯誤的,decltype(a)::v是有效的合格代碼,這是一個主要表達式

作爲解決方法,您可以使用typedef。例如:http://ideone.com/clone/7FKUJ

+0

這些都不適用於4.6.2 – 2012-01-28 20:45:31

+0

這是不正確的。 – Puppy 2012-01-28 20:46:29

+0

是的,我啓用了C++ 0x std編譯。哦,我現在只是使用typedef解決方法 – 2012-01-28 20:49:00

1

它是標準的,或者至少它當然是。我相信有關於此的DR提交,它可能已經在最終標準中得到修復,但可能是因爲下一個標準的修復。這很簡單,因爲在::之前decltype不是有效的語法產品。

+6

是的,它使它在最後一刻進入C++ 11。 http://stackoverflow.com/questions/5525587/c0x-decltype-and-the-scope-resolution-operator – JohannesD 2012-01-28 20:48:25

+1

好抓Johannes,這是一個騙局。 – 2012-01-28 20:53:21