天天看点

【PCL】PCL与MFC结合的冲突PCL与MFC结合的冲突

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 '::'

【PCL】PCL与MFC结合的冲突PCL与MFC结合的冲突

定位问题位置:

错误原因:

关于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的地方,求大神给与解决。