2012-03-31 3 views
2

Я пытаюсь получить библиотеку Aruco AR, пробовав простой тест в моем коде.Проблемы с перегруженным вызовом метода в C++

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

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

Я думаю, что проблема эта линия:

CameraParameters cParams(); 

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

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

CameraParameters cParams; 

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

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

1

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

1

Держу пари, это потому, что:

CameraParameters cParams(); 

который фактически декларирует функция cParams не принимает никаких аргументов и возвращает CameraParameters.

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

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

CameraParameters cParams; 
Смежные вопросы