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);
}

include/opencv2/core/cvstd.hpp:647: undefined reference to `cv::String::deallocate()'

今天编译一个执行文件时发生了如下错误 /home/archermind/test/jni/include/opencv2/core/mat.inl.hpp:804: undefined refere...
  • u010684585
  • u010684585
  • 2017年11月01日 09:03
  • 678

opencv导入头文件时报错#include<opencv2/core/core.hpp>

一、首先要确保你的电脑上opencv的环境和visual studio上的环境都配置好了,测试的时候通过了没有问题。 二、那么只要在你项目里面的属性设置里面配置一下包含目录就OK了,具体步骤如下 ...
  • sinat_29957455
  • sinat_29957455
  • 2017年02月23日 21:04
  • 4325

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

1. 错误输出     ./zlibrary/ui/src/win32/w32widgets/W32VBorderBox.cpp(114) : error C2589: “(”: “::”右边的...
  • xidianzhimeng
  • xidianzhimeng
  • 2014年03月13日 17:50
  • 11313

error C2589: “(”:“::”右边的非法标记

错误 42 error C2589: “(”:“::”右边的非法标记 D:\pcl-1.7\pcl\correspondence.h 70 也许在你的代码里有#defined max ...
  • u012943043
  • u012943043
  • 2017年05月01日 16:14
  • 912

关于“(”:“::”右边的非法标记

今天在用Matlab 2016+VS2013编译matconvnet-1.0-beta21时,vl_imreadjpeg.cpp函数中出现“(”:“::”右边的非法标记错误: 根据[1],错误产生...
  • lsxpu
  • lsxpu
  • 2016年09月16日 17:20
  • 1086

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

pcl1.7版本pcd_io.h 70:error: C2589: “(”:“::”右边的非法标记
  • rs_huangzs
  • rs_huangzs
  • 2016年03月22日 14:23
  • 3162

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

【VS2013】error C2059: 语法错误:“::” error C2589: “(”:“::”右边的非法标记
  • qq_30214939
  • qq_30214939
  • 2017年03月26日 21:55
  • 1064

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

【原文:http://blog.csdn.net/rs_huangzs/article/details/50954828】 最近用pcl 1.7来编写程序,在程序利用源码中的例子来进...
  • zhazhiqiang2010
  • zhazhiqiang2010
  • 2016年09月09日 11:14
  • 1397

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...
  • zqf_office
  • zqf_office
  • 2014年04月25日 10:15
  • 5401

hpp头文件与h头文件的区别

hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接...
  • wuchuanpingstone
  • wuchuanpingstone
  • 2015年12月08日 13:29
  • 2968
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT引用OpenCV出现错误:warpers_inl.hpp:146: error: C2589: “(”:“::”右边的非法标记
举报原因:
原因补充:

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