Container include order making a difference with VS140 toolset 但不是 VS120
Container include order making a difference with VS140 toolset but not not VS120
我有一个 VS 解决方案(包含许多项目),它使用 Visual Studio 使用 VS120(Visual studio 2013)工具集构建查找。
现在我想开始使用一些库,这些库利用了 VS120 工具集未完全实现的一些 C++11 功能,因此现在似乎是切换到 VS140 的好时机。
但是当我这样做的时候,我突然在编译 std 库容器时遇到了一些错误(实际上是 6478 个错误)。
我做了一些调查,注释掉了代码,到目前为止我发现如果我编译一个特定的源文件,编译到
时就会出错
#include <queue>
现在上面的行出现了几个includes,在其他一些include之后。
如果然后在我的源文件的开头放入完全相同的行,在任何其他包含之前,它构建没有错误。
所以似乎在另一个 headers 中设置或更改了某些东西,这导致了问题...但仅限于 VS140 工具,而不是 VS120
在我进一步深入兔子洞试图找出造成这种情况的原因之前,我想知道是否有人知道它可能是什么?
编辑:
对不起,我忘了post错误的例子。
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
最可能的原因是 #include <queue>
之前的 header 之一中的宏重新定义了 <queue>
header 使用的内容。
例如如果你有:
#include "some_project_header.h"
#include <queue>
和some_project_header.h
包含:
#define emplace 1
// ...
然后它会完全破坏 <queue>
header 的编译,因为当编译器看到 std::queue::emplace
成员函数时它会说 1
而不是 [=19] =]例如
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 中添加的),那么它就不会有那个问题。
如果我的猜测是正确的,那么您 header 中的某些内容正在使用不应该使用的名称,并且需要修复。
一个快速解决方法是将 #include <queue>
移动到文件的顶部,这样它就包含在另一个 header 的问题之前,但这并不能真正解决问题,只是隐藏它。
我有一个 VS 解决方案(包含许多项目),它使用 Visual Studio 使用 VS120(Visual studio 2013)工具集构建查找。
现在我想开始使用一些库,这些库利用了 VS120 工具集未完全实现的一些 C++11 功能,因此现在似乎是切换到 VS140 的好时机。
但是当我这样做的时候,我突然在编译 std 库容器时遇到了一些错误(实际上是 6478 个错误)。
我做了一些调查,注释掉了代码,到目前为止我发现如果我编译一个特定的源文件,编译到
时就会出错#include <queue>
现在上面的行出现了几个includes,在其他一些include之后。
如果然后在我的源文件的开头放入完全相同的行,在任何其他包含之前,它构建没有错误。
所以似乎在另一个 headers 中设置或更改了某些东西,这导致了问题...但仅限于 VS140 工具,而不是 VS120
在我进一步深入兔子洞试图找出造成这种情况的原因之前,我想知道是否有人知道它可能是什么?
编辑:
对不起,我忘了post错误的例子。
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
最可能的原因是 #include <queue>
之前的 header 之一中的宏重新定义了 <queue>
header 使用的内容。
例如如果你有:
#include "some_project_header.h"
#include <queue>
和some_project_header.h
包含:
#define emplace 1
// ...
然后它会完全破坏 <queue>
header 的编译,因为当编译器看到 std::queue::emplace
成员函数时它会说 1
而不是 [=19] =]例如
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 中添加的),那么它就不会有那个问题。
如果我的猜测是正确的,那么您 header 中的某些内容正在使用不应该使用的名称,并且需要修复。
一个快速解决方法是将 #include <queue>
移动到文件的顶部,这样它就包含在另一个 header 的问题之前,但这并不能真正解决问题,只是隐藏它。