MFC-error C2589: “(”:“::”右边的非法标记

MFC-error C2589: “(”:“::”右边的非法标记

错误信息

① 错误 C2589 “(”:“::”右边的非法标记
② 错误 C2059 语法错误:“)”

出错语句

      inline double 
      getFitnessScore (double max_range = std::numeric_limits<double>::max());

其中的std::numeric_limits<double>::max()报错了

问题原因

网上查到说函数模板max与Visual C++中的全局的宏max冲突

goto之后发现本应该是函数的max()定位到了minwindef.h下的

#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#endif  /* NOMINMAX */

也就是说,c++在编译的时候,首先解析宏定义,把本应该是函数的std::numeric_limits<double>::max()解析成了宏,发生了冲突。

解决办法

网络上推荐了几个办法,翻了一圈解决了这个问题,做一下记录,分享给出现这个问题的朋友做个参考

方法1:使用min或者max的时候加上括号

首先和其他的教程中一样不推荐这个方法,因为拿我这个案例来说,出错的点是PCL库中的文件,尽量不要修改

这个我也尝试了一下,推荐这个的帖子,涉及到的函数是std::min,std::max,尝试了帖子中推荐的加括号的方式,以及自己想着把括号换一下位置,但是加入之后都没有解决,就都复原了

方法2:在头文件添加#define NOMINMAX ,或者预处理器添加NOMINMAX 预处理器NOMINMAX
添加后,报错没有解决,而且多出来了

C3861	“min”: 找不到标识符	mfc_bin	C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\GdiplusTypes.h

C3861	“max”: 找不到标识符	mfc_bin	C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\GdiplusTypes.h	481	

出问题的点增加了GdiplusTypes.h,直接关掉min,max宏的定义还是有问题

方法3:#undef max 和 #undef min (亲测有效)

首先找到出报错的头文件的位置,把#include <windows.h>提前到该头文件之前包含 (关键步骤)

然后在包含报错的头文件之前加入

#undef max
#undef min

这两句话,目的是先将宏定义minmax编译通过windows.h,再解除minmax的宏定义,让minmax函数编译通过之前报错的头文件

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值