2016-03-15 40 views
2

是否有補丁(官方或非官方)讓智能感知停止報告每個使用decltype作爲語法錯誤?它編譯得很好,所以我知道decltype被支持,但是看起來非常分散,看到處處都是紅色的小波,並且很難在代碼中發現實際的錯誤。每個編譯給我上百個非錯誤的清單 - 在代碼庫每次使用的decltype基本上至少3,例如:VS2013智能感知不理解decltype

std::for_each(std::begin(list), std::end(list), [](const decltype(list)::value_type& item) 
{ 
    <do stuff with item> 
}); 

將產生如下(非)錯誤:

IntelliSense: global-scope qualifier (leading '::') is not allowed 
IntelliSense: expected a ')' 
IntelliSense: identifier "item" is undefined 

此時升級到VS2015不是一種選擇。 (我懷疑我可以說服公司掏腰包升級每臺電腦,只升級其中一部分會導致向後兼容性問題。)

就個人而言,我寧願不使用decltype,直到我們得到IDE完全支持它(我無處知道你實際上需要它),但我認爲我也不能說服所有人。我只是想讓所有這些虛假的錯誤消失,以便我可以找到真正的錯誤,而不會造成數以千計的誤報。

+0

ü現在,升級到VS 2015年,什麼樣的?自由! –

+1

您最好的選擇可能是使用V120工具集的2015社區版保留Visual Studio 2013兼容性。不過我沒有測試過。 – drescherjm

+0

@ Cheersandhth.-Alf - 是嗎?儘管如此,公司無法在項目中期升級所有系統。當然不是我的要求。混亂的機會太多了。 –

回答

3

給出一個幫手模板別名

template <typename T> using id = T; 

可以避開智能感知錯誤,同時仍保持代碼完全有效,通過寫id<decltype(list)>::value_type,你本來已經寫decltype(list)::value_type

根據多久decltype後面緊跟::,您可能希望創建簡單的宏:

#define DECLTYPE(x) id<decltype(x)> 
+0

這確實起作用。不幸的是,爲了完全實現,它需要對代碼進行數百次(當然還有次要的)更改,而且我必須讓很多人清除這種事情。我可能會在下次代碼審查時提出來。這是值得的+1,但我仍然希望有一個解決方案,不需要改變所有的代碼。 –

+0

你*可以*命名你的宏'decltype'並把它放在一個共同的標題中,我想......但我不太確定這是個好主意。 – hvd

+0

@hvd:如果在'#ifdef __INTELLISENSE__'後面執行,它不會那麼糟糕。 – MSalters