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。
添加后,报错没有解决,而且多出来了
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
这两句话,目的是先将宏定义min
和max
编译通过windows.h
,再解除min
和max
的宏定义,让min
和max
函数编译通过之前报错的头文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2020-04-20 postgresql-10.12-2-windows-x64安装成功后在安装postgis-bundle-pg96x64-setup-2.5.3-1时提示Spatial database creation failed