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

C++ C2143包含boost/optional.hpp时出现语法错误,c++,boost,visual-studio-2015,optional,boost-optional,C++,Boost,Visual Studio 2015,Optional,Boost Optional,我被一个我无法理解的编译时错误所困扰。我尝试在我的代码中使用boost::optional,一旦我包含boost/optional.hpp我就不能再构建我的项目了。如果我把这个include语句注释掉,它就行了。我甚至没有在代码中实际使用boost::optional,只有类标题中的include语句(请参见下面的完整标题)。编译器错误是C2143语法错误:missing','before'由于一个有价值的提示,我可以找出原因。我在项目设置中打开了编译器开关/std:c++latest,以便能够

我被一个我无法理解的编译时错误所困扰。我尝试在我的代码中使用
boost::optional
,一旦我包含
boost/optional.hpp
我就不能再构建我的项目了。如果我把这个include语句注释掉,它就行了。我甚至没有在代码中实际使用
boost::optional
,只有类标题中的include语句(请参见下面的完整标题)。编译器错误是
C2143语法错误:missing','before'由于一个有价值的提示,我可以找出原因。我在项目设置中打开了编译器开关
/std:c++latest
,以便能够使用c++17功能。激活此开关将删除一些不推荐使用的语言功能,特别是当前Boost发行版(1.62.0)中仍在使用的
std::binary_函数
,从而产生编译器错误。最后,我决定删除开关
/std:c++latest
(并使用普通方式声明我的名称空间),这就解决了问题。谢谢大家的帮助。

boost 1.63.0解决了这个问题。它不再使用在C++17中删除的
std::binary_函数

在我的例子中,我在Force include文件(C++->Advanced)中有一个#define new DEBUG_new(定义新调试)#。
我通过添加一个#undef new berore the boost#include#然后#define new DEBUG(定义新调试)new after来修复它。

请用or来回答您的问题。同时发布文本,而不是图片。向我们显示触发错误的确切行,并请编辑您的问题,将代码作为文本,而不是屏幕截图。另外,
std::binary_函数
也被弃用。除了“停止发布图片,我无法复制/粘贴它们以重新制作”之外,关于“因此我的Boost发行版本身应该没有问题。”:尽管如此,指定您正在使用的boost版本不会有什么坏处。@Singerofthef所有这些不推荐的用法都来自boost标题,而不是我的代码。您是否正在使用
/std:c++latest
?我知道这个开关删除了c++17中将要删除的部分内容,而且Boost(或这个特定的Boost库)可能还没有适应这种变化。如果您正在使用它,您应该尝试一下
/std:c++14
,看看它是否适合您。我还可以使用
/std:c++latest
编译,只需在我的比较_pointees.hpp。如果您真的想在Boost删除不推荐的用法之前使用C++17功能,这可能是一个很好的解决方法。是的,我可以肯定地确认这句话。使用
boost 1.63.0
我可以使用
/std:c++latest
开关和
boost/optional.hpp
一起使用,没有任何问题。不幸的是,在boost\algorithm\string\detail\util.hpp(boost版本1.64)中还有另一个
std::unary_函数的用法-(在
boost\icl\type\u traits\predicate.hpp
(1.65版)中还使用了
std::一元函数和
std::二元函数
#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;
   };
}
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 ==========
#pragma once

#include <boost/optional.hpp>
#include "../include/Test.h"