PCL与MFC结合的冲突
系统:windows 10
PCL版本:pcl 1.8.1
VS版本:vs2015(vc14)
1. error C2589: “(”: “::”右边的非法标记 、error C2059: 语法错误 : “::”
MFC程序过程中,PCL使用STL一些类编译出错,放到Console Application里一切正常。
比如出现如下错误:
pcl_visualizer.hpp(1429): error C2059: syntax error: '::'
pcl_visualizer.hpp(1429): error C2589: '(': illegal token on right side of '::'
定位问题位置:
错误原因:
关于max、min的问题是 PCL 使用 STL 中 max、min 函数与 MFC 中 minwindef 定义的宏 max、min 冲突。
解决办法:
1. 设置项目属性,在预定义处理器中添加定义NOMINMAX来禁止使用Vsual C++的min/max宏定义。
项目属性 --> C/C++ --> 预处理器 ——> 预处理器定义 (此处添加预定义编译开关 NOMINMAX)注意!!!一定要加在第一个上面。
2. 在每个出错的地方加上括号,与Vsual C++的min/max宏定义区分开(我采用的这种方法)
若自己写的出错,如
修改为:
3.对于使用了Windef文件的AtlImage.h 和GDIPlus.h,直接对里面的max() min()函数进行替换;或者 在使用到 max() min()函数 的头文件定义后面添加:
#ifdef max
#define max(a,b) FUN....
#endif
这第三种解决法我也没弄懂,参考:
max 宏定义取消:error C2589: error C2059: 语法错误 : “::”
2. error C2661: “operator new” : 没有重载函数接受 3 个参数
错误原因:
对于mfc与pcl的各种冲突,例如其上。
解决方法:
作者直接注销了,dlg里面的#define new DEBUG_NEW
也可参考:http://bbs.csdn.net/topics/330096920
#ifdef _DEBUG
//#define new DEBUG_NEW //wishchin 为消除pcl不能拿new三个参数!!!
#endif
参考:PCL:PCL与MFC 冲突总结
3.error C3861: ‘RGB’: identifier not found
ClassView.cpp(316): error C3861: 'RGB': identifier not found
错误原因:
PCL 中的RGB结构与MFC中的RGB宏冲突问题。PCL在定义struct RGB时进行了 RGB宏的检测 如果检测到了RGB宏就将其取消,导致MFC中使用的RGB没有定义。这在对话框程序中不会出现,在基于vc框架的单文档中出现,因为MFC向导自建的对话框类中会用到RGB宏。
解决方法:
目前我也没有什么好方法解决,只是注释掉了MFC用到RGB的地方,求大神给与解决。