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

3
我遇到了一个编译时错误,但我无法理解。我试图在我的代码中使用 boost::optional,但是一旦我包含了boost/optional.hpp,我就无法再构建我的项目了。如果我注释掉这个包含语句,它就能工作。我甚至还没有在我的代码中实际使用 boost::optional,只是在类头文件中包含了这个语句(请参见下面的完整头文件)。编译器错误是C2143 语法错误:'<'之前缺少',',这发生在另一个 Boost 头文件 boost/utility/compare_pointees.hpp 中(请参见下面的 GitHub 链接)。我已经在同一个项目中成功使用了来自 Boost 的其他东西,如 boost::filesystem::path,因此我的 Boost 分发本身应该没有问题。

这是我的环境:Microsoft Visual Studio Professional 2015 版本 14.0.25431.01 更新 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行。您可以在GitHub上查看此文件的完整内容https://github.com/boostorg/utility/blob/boost-1.62.0/include/boost/utility/compare_pointees.hpp
编译器输出只显示了这些消息:
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 库的问题。但我该如何找出我的类或项目设置有什么问题呢?
附言:即使我在项目中使用这些最原始的头文件和源文件,我也能重现这种行为。
头文件 Test.h:
#pragma once

#include <boost/optional.hpp>

源文件 Test.cpp:

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

除了“不要发图片,我不能复制/粘贴以进行重现”之外,关于“所以我的 Boost 发布应该没有问题”,不过最好还是明确你正在使用的 Boost 版本。 - Adrian Colomitchi
@SingerOfTheFall,这个不推荐使用的用法来自于Boost头文件,而不是我的代码。 - Software Craftsman
@AdrianColomitchi 我的 Boost 版本是 1.62.0,这在文本中有提到。 - Software Craftsman
请展示包含此头文件的源代码文件。 - Martin Bonner supports Monica
3
你是否在使用/std:c++latest编译选项?我知道这个选项会移除一些将在c++17中移除的内容,因此可能Boost(或这个特定的Boost库)还没有适应这种变化。如果你在使用它,可以尝试使用/std:c++14选项,看看能否解决问题。 - llonesmiz
显示剩余9条评论
3个回答

5
我通过 jv_ 提供的有价值的提示找到了原因。我在项目设置中打开了编译器开关 /std:c++latest,以便使用 C++17 nested namespace definition 功能。激活此开关会删除一些已弃用的语言特性,特别是 std::binary_function,而当前 Boost 发行版(1.62.0)仍在使用该特性,从而导致编译器错误。最后,我决定删除开关 /std:c++latest(并使用普通方式声明我的命名空间),这解决了问题。感谢大家的帮助。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jonathan Sharman

4
问题在boost 1.63.0中得到了解决。它不再使用C++17中已被移除的std::binary_function

是的,我绝对可以确认这个说法。使用 boost 1.63.0 版本,我可以毫无问题地使用 /std:c++latest 开关以及 boost/optional.hpp 库。 - Software Craftsman
不幸的是,在boost\algorithm\string\detail\util.hpp(boost版本1.64)中还有另一个使用std::unary_function的地方。 :-( - antred
boost\icl\type_traits\predicate.hpp(版本1.65)中还使用了 std::unary_functionstd::binary_function - vonludi

1

在我的情况下,我在强制包含文件(C++->Advanced)中有一个#define new DEBUG_NEW。我通过在boost #include之前添加一个#undef new,然后在之后添加#define new DEBUG_NEW来修复它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接