2017-02-20 53 views
-3

我有一個VS解決方案(包含許多項目),它使用Visual Studio使用VS120(Visual Studio 2013)工具集構建查找。容器包括與VS140工具集有所不同的訂單,但不是VS120

現在我想開始使用一些使用VS120工具集未完全實現的C++ 11功能的庫,所以現在似乎是切換到VS140的好時機。

但是當我這樣做時,我突然在編譯std庫容器時遇到了一些錯誤(實際上是6478個)。

我已經做了一些調查,代碼註釋出來,到目前爲止,我發現,如果我編譯一個特定的源文件,編譯時達到

#include <queue> 

現在上面一行出現幾個包括上下錯誤發生,其他一些包括之後。

如果在我的源文件的開始部分放置完全相同的行,在其他任何包含之前,它會生成沒有錯誤。

如此看來,事情正在建立或導致該問題的其他頭的一個改變......但只與VS140的工具,而不是VS120

之前,我再消失在兔子洞嘗試找到造成這種情況的原因,我想知道是否有人有任何想法可能是什麼?

編輯:

對不起,我忘了發佈錯誤的例子。

Severity Code Description Project File Line Suppression State 
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 166 
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 424 
Error C2334 unexpected token(s) preceding '{'; skipping apparent function body GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 167 
Error C2334 unexpected token(s) preceding '{'; skipping apparent function body GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 426 
Error C2206 'swap': typedef cannot be used for function definition GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 180 
Error C2206 'swap': typedef cannot be used for function definition GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 442 
Error C2091 function returns function GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 74 
Error C2091 function returns function GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 103 
Error C2091 function returns function GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 166 
Error C2091 function returns function GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 333 
Error C2091 function returns function GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 376 
Error C2091 function returns function GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 424 
Error C2065 '_Left': undeclared identifier GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 180 
Error C2065 '_Right': undeclared identifier GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 180 
Error C2065 '_Left': undeclared identifier GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 442 
Error C2065 '_Right': undeclared identifier GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 442 
Error C2061 syntax error: identifier 'value' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 74 
Error C2061 syntax error: identifier 'value' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 102 
Error C2061 syntax error: identifier 'value' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 333 
Error C2061 syntax error: identifier 'value' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 374 
Error C2061 syntax error: identifier '_Swap_adl' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 424 
Error C2059 syntax error: '(' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 166 
Error C2059 syntax error: ')' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 166 
Error C2059 syntax error: '{' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 167 
Error C2059 syntax error: '(' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 424 
Error C2059 syntax error: ')' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 424 
Error C2059 syntax error: '{' GuiDemo-app C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\queue 426 
+1

什麼錯誤信息?發佈樣本。 –

+0

對不起,當我發佈這個問題時,我的意思是這樣做,但以某種方式忘記了。 –

回答

1

最可能的原因是#include <queue>之前在報頭中的一個宏,它重新定義了<queue>標題上使用的東西。

例如如果您有:

#include "some_project_header.h" 
#include <queue> 

some_project_header.h包含:

#define emplace 1 
// ... 

然後,它會徹底打破<queue>頭的編譯,因爲當編譯器看到std::queue::emplace成員函數它會說1代替emplace例如

template<class T, class Container = deque<T>> 
class queue { 
    // ... 
    template <class... Args> 
    reference 1(Args&&... args) 
    { return c.emplace_back(std::forward<Args>(args)...); } 

如果VS120沒有實現std::queue::emplace構件還(其中加入在C++ 11),那麼就不會存在這樣的問題。

如果我的猜測是正確的,你的頭文件中的某些東西正在使用一個它不應該使用的名稱,並且需要修復。

快速解決的方法是將#include <queue>移動到文件的頂部,以便在問題出現在另一個頭部之前,但這並不能真正解決問題,只是隱藏它。

+0

謝謝,我在想爲什麼標準庫文件可能會發生變化,由於某種原因,我完全忽略了VS120可能只用實現一些C++ 11庫更改的可能性,因爲它只執行一些語言的變化。您所描述的內容似乎與我所看到的錯誤相吻合,這表明語法已經完全擺脫了怪獸,正如您可能會看到宏定義是否重寫源代碼一樣。 –

+1

解決了!事實證明,第三方庫使用#define來禁止noexcept,以便相同的代碼將在Visual Studio 2013及之前以及支持noexcept的非VS編譯器(VS2015之前的VS中未實現)中生成。由於VS140工具集庫使用它,事情變得完全搞砸了。再次感謝您的幫助,回過頭來看,答案似乎相當明顯,但有時候一些遠離問題的人可以看到接近的人真的應該明白什麼。 –