MFC-error C2589: “(”:“::”右邊的非法標記

rainbow70626發表於2024-04-20

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

這兩句話,目的是先將宏定義minmax編譯透過windows.h,再解除minmax的宏定義,讓minmax函式編譯透過之前報錯的標頭檔案。

原文連結:https://blog.csdn.net/qq_31437541/article/details/113667722

相關文章