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
函式編譯透過之前報錯的標頭檔案。