2013-02-18 55 views
0

有沒有辦法在VS中識別缺少的類型名稱? VS是否至少會產生某種警告?如何在Visual Studio中識別缺少的類型名稱

template<class T> 
void dum() { 
    std::vector<T> dum_vector; 
    typename std::vector<T>::iterator it = dum_vector.begin(); 
    // VS compiles it with or without typename, but I would like to know whether 
    // I forgot to put a typename, since without typename the code may not compile 
    // with another compiler (e.g. GCC) 
} 
+2

「因爲沒有typename,代碼可能無法與另一個編譯器編譯」=>「,因爲沒有typename代碼沒有很好地形成C++」。 – juanchopanza 2013-02-18 15:56:18

+0

我們在談論什麼版本的VS? – fredoverflow 2013-02-18 16:00:43

+4

@FredOverflow這是如何重複的?這個問題並不是問關鍵詞是什麼或者它們在哪裏應用,而是如何讓MSVC從它的唯一性位置下臺,至少在接受非標準語法時提及*。 – Angew 2013-02-18 16:04:18

回答

1

我不確定它是否具有100%的標準一致性,但對於明確需要typename的所有或大多數情況,MSVC會生成Compiler Warning (level 1) C4346。所以只要你用編譯器標記/W1或更高編譯你應該沒問題。

+0

這很奇怪。我正在使用\ W3,但是在VS10中沒有收到任何警告。 – user2083875 2013-02-18 20:18:32

1

實際上,在當前版本的C++(C++ 11)中,你不需要寫太多東西。你可以這樣寫:

auto it = dum_vector.begin(); 

你就完成了。

請注意,自MSVC10以來,支持auto,所以如果您使用它,我建議您使用auto代替blah::blah::iterator。如果您使用的是舊版本,最好儘可能升級並充分利用C++ 11功能的優勢。如果你不能這樣做,那麼它是非常不可能 MSVS可以告訴你缺少的類型名稱,因爲編譯器首先編譯非標準代碼!

+1

謝謝,雖然我非常感謝C++ 11中的auto,但是當前的項目我的工作還沒有切換到C++ 11兼容編譯器。 – user2083875 2013-02-18 16:11:17

+0

另外感謝您的補充說明,我也同意這一點。如果對我的問題沒有其他答案,我會接受你的答案(因爲你試圖解釋爲什麼不提供這種支持)。 – user2083875 2013-02-18 16:27:42