为什么我在iterator_facade中得到编译错误,具体取决于我将Boost头包括在哪里?

时间:2015-09-03 11:40:57

标签: c++ visual-c++ boost visual-studio-2015

我试图将Boost纳入我现有的中型项目中。我有预编译的头文件stdafx.h,其中我保留了所有我的C ++ stdlib #include指令(加上一些Windows头文件)和许多包含.cpp的{​​{1}}个文件他们stdafx.h。它在第一行包含A.cpp,然后仅包含该文件所需的其他标题。我想在stdafx.h中使用boost::program_options,因此我在A.cpp之后立即将其添加到包含列表中,因此stdafx.h的顶部如下所示:

A.cpp

然后我继续编译项目,但遇到了以下错误:

#include "stdafx.h"

#include <boost/program_options.hpp>

// more #includes

我做了一点实验,发现如果我把

Severity    Code    Description Project File    Line
Error   C2976   'boost::iterators::detail::postfix_increment_result': too few template arguments    testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  789
Error   C1903   unable to recover from previous error(s); stopping compilation  testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2143   syntax error: missing ';' before '++'   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  534
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  541
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  600
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  606
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  789
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2433   'type': 'inline' not permitted on data declarations testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2888   'if_<T1,T2,T3>::type type': symbol cannot be defined within namespace 'iterators'   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2976   'boost::iterators::iterator_facade': too few template arguments testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  534
Error   C2976   'boost::iterators::iterator_facade': too few template arguments testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  541
Error   C2976   'boost::iterators::iterator_facade': too few template arguments testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  600
Error   C2976   'boost::iterators::iterator_facade': too few template arguments testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  606

#include <boost/program_options.hpp> 最后 - 最后一行 - 所有内容编译都很好,但如果我尝试将其放在stdafx.h中的任何位置,我会收到上述错误。我真的不明白这是怎么回事;并不是预处理器只执行无意识插入,在这种情况下,在预处理器完成其工作后,应将相同的输出提供给编译器吗?原因是什么?我一直在搜索,但我只找到了那些真正想要使用A.cpp并且在代码中出错的人发布的帖子,而不是在Boost标题中。

我的配置: VS 8.1在Windows 8.1,Boost 1.59.0,x86项目上,使用iterator_facade

构建

更新:如果我在/MTA.cpp中都包含该标头,它也会有效。

UPDATE2:有趣的是,这是编译失败后我在输出窗口中的内容:

stdafx.h

1 个答案:

答案 0 :(得分:0)

最可能的解释是,你的一个头文件丢失包括警卫(或包含警卫有一个错字),你实际上包括一些提升头两次。 (并非所有的提升标题都包括警卫。你应该包括的那些,但是其中一些只是因为效率原因而没有#34;我告诉你。)< / p>

或者,你在某个地方包含了一个命名空间内的boost,这是它无法真正保护自己的东西。

这个错误'boost::iterators::detail::postfix_increment_result': too few template arguments正是我所期望的,如果它是一些模板定义,并且编译器第二次遇到了这个定义。