![](/img/trans.png)
[英]C++ templates: C2143 error in VS2017 but compiles in VS2013
[英]error in <ratio> and <memory> after upgrading from vs2013 to vs2017
我最近升級到 Visual Studio 2017,現在我從標准庫中收到語法錯誤。
這是輸出:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\ratio(220): error C2947: expecting '>' to terminate template-argument-list, found '<'
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\ratio(221): error C2226: syntax error: unexpected type 'std::integral_constant<_Ty,_Val>::type'
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\ratio(221): error C2988: unrecognizable template declaration/definition
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\ratio(221): error C2059: syntax error: ','
這是它發生的地方:
template<class _R1,
class _R2,
bool _Sfinae>
struct _Ratio_multiply_sfinae<_R1, _R2, _Sfinae, void_t<
typename _Ratio_multiply<_R1, _R2>::_Num::type,
typename _Ratio_multiply<_R1, _R2>::_Den::type>>
{ // typename ratio<>::type is unnecessary here
typedef ratio<
_Ratio_multiply<_R1, _R2>::_Num::value,
_Ratio_multiply<_R1, _R2>::_Den::value> type;
};
我的猜測是編譯器以某種方式認為>>
是一個運算符,但我無法將其編輯為> >
以進行測試。
我沒有包含<ratio>
但我認為它用於<chrono>
,因此用於<mutex>
。
更新:
我剛剛意識到,在編譯期間,InteliSense 會抱怨那個地方,但是在編譯之前和之后它並沒有抱怨它。 不知何故,似乎編譯器設置已更改,但我不知道。 另一個問題是為什么它適用於 vs2013。
我認為標准在 C++03 和 C++11 之間發生了變化,以解決您提到的有關“>>”與“>>”的問題
您可能需要切換編譯器版本。
這是一個老話題。 但我最近遇到了一個非常相似的問題。 根本原因是代碼中的某個地方有一個像
#define void_t void
這引發了編譯器錯誤。 將其轉換為 typedef 有幫助。
正如你可以看到void_t
在的定義中使用_Ratio_multiply_sfinae
並且也是在定義<ratio>
作為模板結構。 上面的定義搞砸了一切。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.