QT引用OpenCV出现错误:warpers_inl.hpp:146: error: C2589: “(”:“::”右边的非法标记

原创 2016年08月30日 09:29:58

QT中出现这种重复定义的问题很正常

问题

QT中引入OpenCV在编译的时候出现了下面的问题:

F:\workspace\show\xhxzbzs\LiveEncoder\3rdparty\libopencv249\include\opencv2\stitching\detail\warpers_inl.hpp:146: error: C2589: “(”:“::”右边的非法标记
f:\workspace\show\xhxzbzs\liveencoder\3rdparty\libopencv249\include\opencv2\stitching\detail\warpers_inl.hpp(145): 编译类 模板 成员函数“void cv::detail::RotationWarperBase<cv::detail::PlaneProjector>::detectResultRoi(cv::Size,cv::Point &,cv::Point &)”时
f:\workspace\show\xhxzbzs\liveencoder\3rdparty\libopencv249\include\opencv2\stitching\detail\warpers_inl.hpp(68): 参见对正在编译的函数 模板 实例化“void cv::detail::RotationWarperBase<cv::detail::PlaneProjector>::detectResultRoi(cv::Size,cv::Point &,cv::Point &)”的引用
f:\workspace\show\xhxzbzs\liveencoder\3rdparty\libopencv249\include\opencv2\stitching\detail\warpers.hpp(130): 参见对正在编译的类 模板 实例化“cv::detail::RotationWarperBase<cv::detail::PlaneProjector>”的引用

出现问题的代码段

出现问题的代码段如下:

template <class P>
void RotationWarperBase<P>::detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br)
{
    float tl_uf = std::numeric_limits<float>::max();
    float tl_vf = std::numeric_limits<float>::max();
    float br_uf = -std::numeric_limits<float>::max();
    float br_vf = -std::numeric_limits<float>::max();

    float u, v;
    for (int y = 0; y < src_size.height; ++y)
    {
        for (int x = 0; x < src_size.width; ++x)
        {
            projector_.mapForward(static_cast<float>(x), static_cast<float>(y), u, v);
            tl_uf = std::min(tl_uf, u); tl_vf = std::min(tl_vf, v);
            br_uf = std::max(br_uf, u); br_vf = std::max(br_vf, v);
        }
    }

    dst_tl.x = static_cast<int>(tl_uf);
    dst_tl.y = static_cast<int>(tl_vf);
    dst_br.x = static_cast<int>(br_uf);
    dst_br.y = static_cast<int>(br_vf);
}

出现问题的原因

std::numeric_limits()和std()中的函数模板max与Visual C++中的全局的宏max冲突。

Visual C++中的全局的宏函数模板max的代码如下:

 template<class _Ty> inline  
    const _Ty& (__CLRCALL_OR_CDECL max)(const _Ty& _Left, const _Ty& _Right)  
    {   // return larger of _Left and _Right  
    return (_DEBUG_LT(_Left, _Right) ? _Right : _Left);  
    }  

解决方法

方法一

设置项目属性,在预定义处理器中添加定义NOMINMAX来禁止使用Visual C++的min/max宏定义。
项目属性 ——> C/C++ ——> 预处理器 ——> 预处理器定义 (此处添加预定义编译开关 NOMINMAX)
但是visual C++中定义能自动匹配double和int,如果进行了上述设置,代码中手动将int型的数据乘以1.0来达到double的目的。
在QT中相当于在PRO文件中增加

DEFINES += NOMINMAX

方法二

将方法加括号,与Vsual C++的min/max宏定义区分开。例如:

template <class P>
void RotationWarperBase<P>::detectResultRoi(Size src_size, Point &dst_tl, Point &dst_br)
{
    float tl_uf = (std::numeric_limits<float>::max)();
    float tl_vf = (std::numeric_limits<float>::max)();
    float br_uf = -(std::numeric_limits<float>::max)();
    float br_vf = -(std::numeric_limits<float>::max)();

    float u, v;
    for (int y = 0; y < src_size.height; ++y)
    {
        for (int x = 0; x < src_size.width; ++x)
        {
            projector_.mapForward(static_cast<float>(x), static_cast<float>(y), u, v);
            tl_uf = (std::min)(tl_uf, u); tl_vf = (std::min)(tl_vf, v);
            br_uf = (std::max)(br_uf, u); br_vf = (std::max)(br_vf, v);
        }
    }

    dst_tl.x = static_cast<int>(tl_uf);
    dst_tl.y = static_cast<int>(tl_vf);
    dst_br.x = static_cast<int>(br_uf);
    dst_br.y = static_cast<int>(br_vf);
}

相关文章推荐

error C2059: 语法错误:“::” error C2589: “(”:“::”右边的非法标记

pcl1.7版本pcd_io.h 70:error: C2589: “(”:“::”右边的非法标记

【VS2013】error C2059: 语法错误:“::” error C2589: “(”:“::”右边的非法标记

【VS2013】error C2059: 语法错误:“::” error C2589: “(”:“::”右边的非法标记

error C2589: “(”: “::”右边的非法标记;error C2059: 语法错误 : “::”

1. 错误输出     ./zlibrary/ui/src/win32/w32widgets/W32VBorderBox.cpp(114) : error C2589: “(”: “::”右边的...

QT5.0 以上版本qdatetime.h:122: error: C2589: “(”:“::”右边的非法标记

最近用Qt5.2.0版本编译Windows下代码,发现编译错误 D:\Qt\Qt5.2.0\5.2.0\msvc2012\include\QtCore\qdatetime.h:122: er...
  • bulreed
  • bulreed
  • 2014年03月03日 12:07
  • 5269

QT5.0 以上版本qdatetime.h:122: error: C2589: “(”:“::”右边的非法标记

最近用Qt5.2.0版本编译Windows下代码,发现编译错误 D:\Qt\Qt5.2.0\5.2.0\msvc2012\include\QtCore\qdatetime.h:122...

C51error146

  • 2012年01月07日 22:00
  • 179KB
  • 下载

使用cuDNN5编译py-faster-rcnn错误:cudnn.hpp(126): error: argument of type "int" is incompatible ...

前几天在cuda8+cudnn5.1下编译py-faster-rcnn/caffe-fast-rcnn时报错了, /home/guyadong/caffe/py-faster-rcnn/caffe...
  • 10km
  • 10km
  • 2017年03月16日 11:55
  • 3374

【opencv】error C4996 错误及类似错误解决办法

【opencv】error C4996 错误及类似错误解决办法.在自己机器上,运行了一段比人的代码,运行报错error C4996...

qt 出现 error: 'setCodecForTr' is not a member of 'QTextCodec'等错误的请进..

qt版本更新越来越块,更新的同时也有许多改动,坑了不少人.... 出现错误: 请直接查看main函数里面; 这时候只需要注释这两行就行; 出错原因:     Qt5以前很多人习惯用下面这三...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT引用OpenCV出现错误:warpers_inl.hpp:146: error: C2589: “(”:“::”右边的非法标记
举报原因:
原因补充:

(最多只允许输入30个字)