语法检查器指出一些错误,我不知道为什么

时间:2019-08-08 13:25:53

标签: c++ g++ eclipse-cdt mat opencv4

我将Eclipse CDT更新为9.8.1,并且语法检查器开始指出一些并非如此的错误。在此示例中,p3DwOwcv::Mat对象,语法检查器在PO下划线为“无效参数”:

cv::Mat PO = p3Dw-Ow;


Invalid arguments '
Candidates are:
 Mat()
 Mat(int, int, int)
 Mat(int, int, int, const cv::Scalar_<double> &)
 Mat(cv::Size_<int>, int)
 Mat(cv::Size_<int>, int, const cv::Scalar_<double> &)
 Mat(int, const int *, int)
 Mat(int, const int *, int, const cv::Scalar_<double> &)
 Mat(const std::vector<int,std::allocator<int>> &, int)
 Mat(const std::vector<int,std::allocator<int>> &, int, const cv::Scalar_<double> &)
 Mat(const cv::Mat &)
 Mat(int, int, int, void *, unsigned long int)
 Mat(cv::Size_<int>, int, void *, unsigned long int)
 Mat(const std::vector<#0,std::allocator<#0>> &, bool)
 Mat(std::initializer_list<#0>)
 Mat(std::initializer_list<int>, std::initializer_list<#0>)
 Mat(const std::array<#0,unsigned long int3 #1 0> &, bool)
 Mat(const cv::Vec<#0,int3 #1 0> &, bool)
 Mat(const cv::Matx<#0,int3 #1 0,int3 #2 0> &, bool)
 Mat(const cv::Point_<#0> &, bool)
 Mat(const cv::Point3_<#0> &, bool)
 Mat(const cv::MatCommaInitializer_<#0> &)
 Mat(const cv::Mat &, const cv::Range &, const cv::Range &)
 Mat(const cv::Mat &, const cv::Rect_<int> &)
 Mat(const cv::Mat &, const cv::Range *)
 Mat(const cv::Mat &, const std::vector<cv::Range,std::allocator<cv::Range>> &)
 Mat(cv::Mat &&)
 Mat(int, const int *, int, void *, const unsigned long int *)
 Mat(const std::vector<int,std::allocator<int>> &, int, void *, const unsigned long int *)
 Mat(const cv::cuda::GpuMat &)
'

仅当使用MatExpr在声明时分配Mat时才会发生。否则不会发生这种情况:您可以声明一个Mat来分配另一个Mat,或者将MatExpr分配给先前声明的Mat。

此代码已经使用了多年。现在,我正在弄乱它,一段时间后我将无法编译它。

我清理了项目并重建索引,但没有任何改善。

还有其他奇怪的误导性错误。使用名称空间std;除非我添加std ::

,否则将检查器标记向量和unique_lock视为错误

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:3)

MatExpr operator-(const Mat &a, const Mat &b);文档中有自由函数Mat& Mat::operator=(const MatExpr &expr);函数和赋值运算符opencv4,但是没有Mat构造函数接受MatExpr

但是有一个转换运算符:cv::MatExpr::operator Mat() const;应该可以使您的代码正常工作,而它在opencv 3.4.4中可以正常工作。最小示例:

#include <opencv2/core/mat.hpp> // it is really opencv 3.4.4

int main() {
    cv::Mat p3Dw;
    cv::Mat Ow;
    cv::Mat PO = p3Dw-Ow;
}

如果它在opencv 4中不起作用,则他们可能已将复制构造函数设为explicit(即使它不在手册中)。如果是这样,请将MatExpr强制转换为Mat

cv::Mat PO = static_cast<cv::Mat>(p3Dw-Ow);