【问题标题】:Problems with overloaded method call in C++C++中重载方法调用的问题
【发布时间】:2012-03-31 17:05:45
【问题描述】:

我正在尝试通过在我的代码中进行简单测试来使 Aruco AR 库正常工作。

由于某种原因,我无法调用 detect()。我的代码如下:

  cv::Mat image(480,640,CV_8UC3, mimFrameRGB.data()); 
  MarkerDetector mDetector;
  std::vector<Marker> markers;
  CameraParameters cParams();
  float markerSize = 0.1f;
  mDetector.detect(image,markers,cParams,markerSize);

编译器抱怨没有与我的输入参数匹配的重载函数。具体来说,参数 3 应该是 cv::Mat 类型。

查看MarkerDetector的头文件,发现有以下两个方法调用:

 void detect(const cv::Mat &input,std::vector<Marker> &detectedMarkers,cv::Mat camMatrix=cv::Mat(),cv::Mat distCoeff=cv::Mat(),float markerSizeMeters=-1) throw (cv::Exception);
 void detect(const cv::Mat &input,std::vector<Marker> &detectedMarkers, CameraParameters camParams,float markerSizeMeters=-1) throw (cv::Exception);

我试图调用第二个,但是它选择了第一个并给了我一个编译错误。出了什么问题?我的输入参数是否与这两种情况都不匹配?

【问题讨论】:

    标签: c++ methods overloading augmented-reality


    【解决方案1】:

    我认为问题在于这一行:

    CameraParameters cParams();
    

    声明了一个CameraParameters类型的变量,而是一个名为cParams的函数的函数原型,它不接受参数并返回一个CameraParameters。这是 C++ 语言中一个非常烦人的部分,因为代码是合法的,但不能做你想做的事。

    因为cParams 实际上是一个函数原型而不是变量声明,C++ 重载解析机制对参数的类型感到困惑,并且无法正确选择您想要的重载。删除这一行的括号并让它读取

    CameraParameters cParams;
    

    应该解决这个问题。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      问题是;当你声明像CameraParameters cParams(); 这样的cParams 时,你实际上是在声明一个名为cParams 的函数,它返回一个CameraParameters。应该是CameraParameters cParams;(去掉括号)。

      【讨论】:

        【解决方案3】:

        我打赌这是因为:

        CameraParameters cParams();
        

        它实际上声明了一个函数cParams,不带参数并返回一个CameraParameters

        因此,当您调用该方法并将其传递给cParams 时,它会将其解释为函数指针,这可能就是它选择第一个变体的原因。

        替换为:

        CameraParameters cParams;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-22
          • 2014-12-12
          • 1970-01-01
          • 2010-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多