【PCL】PCL与MFC结合的冲突

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/Gordon_Wei/article/details/85236064

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

在这里插入图片描述

定位问题位置:

    minmax[0] = std::numeric_limits<double>::min ();

错误原因:
关于max、min的问题是 PCL 使用 STL 中 max、min 函数与 MFC 中 minwindef 定义的宏 max、min 冲突。

解决办法:

1. 设置项目属性,在预定义处理器中添加定义NOMINMAX来禁止使用Vsual C++的min/max宏定义。
项目属性 --> C/C++ --> 预处理器 ——> 预处理器定义 (此处添加预定义编译开关 NOMINMAX)注意!!!一定要加在第一个上面。
2. 在每个出错的地方加上括号,与Vsual C++的min/max宏定义区分开(我采用的这种方法)

    minmax[0] = (std::numeric_limits<double>::min)();

若自己写的出错,如

    size.Width = std::max(size.Width, elementSize.Width); 

修改为:

    size.Width = (std::max)(size.Width, elementSize.Width); 

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

猜你喜欢

转载自blog.csdn.net/Gordon_Wei/article/details/85236064
pcl