包含boost / optional.hpp时出现C2143语法错误

时间:2016-10-18 12:42:10

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

我遇到了一个我无法理解的编译时错误。我尝试在代码中使用boost::optional,一旦我加入boost/optional.hpp,我就无法再构建我的项目了。如果我评论这个包含声明,它就可以了。我的代码中甚至没有实际使用boost::optional,只是类标题中的include语句(请参阅下面的完整标题)。编译器错误是C2143 syntax error: missing ',' before '<',它发生在另一个Boost标头boost/utility/compare_pointees.hpp中(参见下面的GitHub链接)。我也已经在同一个项目中成功地使用了Boost中的其他东西,例如boost::filesystem::path,所以我的Boost分布应该没有问题。

以下是我的环境:Microsoft Visual Studio Professional 2015 Version 14.0.25431.01 Update 3boost 1.62.0。我还使用第三方库C++ REST SDK,其他一切都是C ++标准库的东西。

我的标题看起来像这样。我想添加一个boost::optional<size_t>作为返回类型的新方法。

#pragma once

#include <boost/optional.hpp>   // <==== ERROR

// C++ REST SDK
#define _TURN_OFF_PLATFORM_STRING
#include <cpprest/http_listener.h>
#include <cpprest/http_msg.h>

namespace SANDBOX::REST
{
   class HttpGetHandler
   {
   public:
       virtual void HandleHttpGetRequest(web::http::http_request request) = 0;
   };
}

报告编译器错误的地方位于Boost标题boost/utility/compare_pointees.hpp第36行。您可以在https://github.com/boostorg/utility/blob/boost-1.62.0/include/boost/utility/compare_pointees.hpp下的GitHub上查看此文件的完整内容

编译器输出只显示以下消息:

1>D:\dev\lib\boost_1_62_0\boost/utility/compare_pointees.hpp(36): error C2143: syntax error: missing ',' before '<'
1>  D:\dev\lib\boost_1_62_0\boost/utility/compare_pointees.hpp(40): note: see reference to class template instantiation 'boost::equal_pointees_t<OptionalPointee>' being compiled
1>D:\dev\lib\boost_1_62_0\boost/utility/compare_pointees.hpp(59): error C2143: syntax error: missing ',' before '<'
1>  D:\dev\lib\boost_1_62_0\boost/utility/compare_pointees.hpp(63): note: see reference to class template instantiation 'boost::less_pointees_t<OptionalPointee>' being compiled
========== Build: 0 succeeded, 1 failed, 2 up-to-date, 0 skipped ==========

这肯定不是Boost库的问题。但是我怎么能弄清楚我的课程或项目设置有什么问题呢?

P.S。即使我在项目中使用这些最原始的头文件和源文件,我也可以重现这种行为:

标题文件Test.h

#pragma once

#include <boost/optional.hpp>

源文件Test.cpp

#include "../include/Test.h"

3 个答案:

答案 0 :(得分:4)

由于jv_提供了有价值的提示,我可以找出原因。我在项目设置中打开了编译器开关/std:c++latest,以便能够使用C ++ 17 nested namespace definition功能。激活此开关会删除一些不推荐使用的语言功能,特别是std::binary_function,它仍然在当前的Boost发行版(1.62.0)中使用,因此会产生编译器错误。最后,我决定删除开关/std:c++latest(并使用普通方式声明我的命名空间),这解决了这个问题。谢谢大家的帮助。

答案 1 :(得分:3)

此问题已在boost 1.63.0中修复。它不再使用在C ++ 17中删除的std::binary_function

答案 2 :(得分:0)

就我而言,我在强制包含文件(C ++-> Advanced)中有一个#define新的DEBUG_NEW。 我通过添加#undef new berore boost#include's,然后在#define new DEBUG_NEW之后修复了它。