2014-04-17 66 views
1

下面的代碼並不G正下方++編譯4.8在G ++ 4.8中的typeof仍然不能與 「::」

#include <vector> 
using namespace std; 

int main() { 
    vector<int> v; 
    typeof(v)::iterator it; 
} 

如果我更換的typeof到decltype使用,它工作正常。我知道有一個模板結構

template<class T> struct Self { 
    typedef T Type; 
}; 

一種變通方法,然後

Self<typeof(v)>::Type::Iterator it; 

但還是它的煩人。

這是應該報告的錯誤嗎?或者這是一個功能?

+3

現在我們已經有了decltype,typeof和死了一樣好。爲什麼要使用它? –

+0

我不喜歡這個詞。 Typeof聽起來更好,但縮短了2個字符 – user31264

+0

*「我不喜歡這個詞,Typeof聽起來更好,而且縮短了2個字符」*這些都不是使用'typeof'的合理理由。 – Ali

回答

4

在這裏,我只是寫了n.m.'s comment作爲答案,並擴大了一點點。

在C++ 11中,我們有decltype,它可以與::一起使用。考慮以下代碼:

#include <vector> 
using namespace std; 

int main() { 
    vector<int> v; 
    decltype(v)::iterator it; 
} 

上面的代碼與g++ -std=c++11 -Wall -Wextra -pedantic typeof.cpp乾淨地編譯。

由於decltype是標準和already supported by gcc 4.3(發佈於2008年,6年前),絕對沒有理由使用gcc擴展typeof來代替。如果您使用decltype,您的代碼將是標準的,因此便於攜帶。

+0

decltype由gcc 4.3支持,但decltype(v):: iterator僅在gcc 4.7或4.8以後才支持。 – user31264

+0

哦,我不知道。在gcc 4.7中肯定支持它,因爲那是我用過的:)而gcc 4.7已經2歲了。 – Ali

+0

我在我的問題中寫道:「如果我將typeof替換爲decltype,它可以正常工作。」,所以你的回答只是重複了我的問題。 – user31264