Проблемы с перегруженным вызовом метода в C ++ - PullRequest
2 голосов
/ 31 марта 2012

Я пытаюсь заставить работать библиотеку Aruco AR , пытаясь выполнить простой тест в моем коде.

По какой-то причине я не могу заставить работать вызов метода Detective ().Мой код выглядит следующим образом:

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

Я пытаюсь вызватьвторой, однако он выбирает первый и выдает ошибку компиляции.Что не так?мои входные параметры не соответствуют ни одному из случаев?

Ответы [ 3 ]

3 голосов
/ 31 марта 2012

Я думаю, что проблема заключается в этой строке:

CameraParameters cParams();

Это не объявляет переменную типа CameraParameters, но вместо этого является прототипом функции для функции с именем cParams который не принимает параметров и возвращает CameraParameters.Это чрезвычайно раздражающая часть языка C ++, поскольку код допустим, но не делает то, что вы хотите.

Поскольку cParams на самом деле является прототипом функции, а не объявлением переменной, разрешение перегрузки C ++механизм запутывается в типах аргументов и не может правильно выбрать желаемую загрузку.Удаление скобок в этой строке и просто чтение

CameraParameters cParams;

должно решить эту проблему.

Надеюсь, это поможет!

1 голос
/ 31 марта 2012

Бьюсь об заклад, это потому, что:

CameraParameters cParams();

, которая фактически объявляет функцию cParams без аргументов и возвращает CameraParameters.

Итак, когда вы вызываете метод ипередать его cParams, он интерпретирует это как указатель на функцию, поэтому, вероятно, поэтому выбирает первый вариант.

Замените его на:

CameraParameters cParams;
1 голос
/ 31 марта 2012

Проблема в том,когда вы объявляете cParams как CameraParameters cParams();, вы фактически объявляете функцию с именем cParams, которая возвращает CameraParameters.Должно быть CameraParameters cParams; (удалить парантез).

...