Überladungsauflösung nicht möglich wegen const oder *__w64 ?
-
Hallo,
folgendes gekürztes Beispiel aus der OpenCV:
#include <cv.h> #include <highgui.h> using namespace cv; int main( int argc, char** argv ) { Mat hsv; int hbins = 30, sbins = 32; int histSize[] = {hbins, sbins}; float hranges[] = { 0, 180 }; float sranges[] = { 0, 256 }; float* ranges[] = { hranges, sranges }; MatND hist; int channels[] = {0, 1}; calcHist( &hsv, 1, channels, Mat(), // do not use mask hist, 2, histSize, ranges, true, // the histogram is uniform false ); }Erzeugt mit VC2005 folgenden Fehler:
d:\...\histogramm.cpp(27) : error C2665: "cv::calcHist": Durch keine der 2 Überladungen konnten alle Argumenttypen konvertiert werden. 1> c:\bibliotheken\opencv2.1.0\include\opencv\cv.hpp(412): kann 'void cv::calcHist(const cv::Mat *,int,const int *,const cv::Mat &,cv::MatND &,int,const int *,const float **,bool,bool)' sein 1> c:\bibliotheken\opencv2.1.0\include\opencv\cv.hpp(418): oder "void cv::calcHist(const cv::Mat *,int,const int *,const cv::Mat &,cv::SparseMat &,int,const int *,const float **,bool,bool)" 1> bei Anpassung der Argumentliste '(cv::Mat *__w64 , int, int [2], cv::Mat, cv::MatND, int, int [2], float *[2], bool, bool)'Die erste Überladung sollte eigentlich perfekt passen. Mir ist nicht klar, warum das nicht funktioniert. Liegt es am fehlendem const, oder an den merkwürdigen "*__w64" die der Compiler in die Argumentliste einfügt? Ich baue für 32 Bit. Mit einem explizitem cast kann ich den Compilerfehler beseitigen.
calcHist( (const Mat*)&hsv, 1, (const int*)&channels[0], Mat(), hist, 2, (const int*)&histSize[0], (const float**)&ranges[0], true, // the histogram is uniform false );Kann der cast noch andere gefährliche Folgen haben?
Das Original OpenCV-Beispiel findet man unter:
http://opencv.willowgarage.com/documentation/cpp/histograms.html?highlight=calchist#calcHist
-
dJohn@work schrieb:
Kann der cast noch andere gefährliche Folgen haben?
So wie du ihn benutzt kann der Cast alles mögliche machen, auch etwas, was du dir vielleicht nicht vorstellst. Benutze nach Möglichkeit immer C++ Casts statt des C-Style Cast. versuch mal, einen static_cast auf deine ganzen Pointer anzuwenden. Wo das __w64 herkommt ist mir schleierhaft, frag am Besten mal im Compilerforum nach. Vielleicht hast du da irgendwelche Compilereinstellungen falsch gesetzt.
Btw: eine Funktion mit 9(!) Argumenten wäre für mich schon ein erster Hinweis darauf, dass ich mich ggf. nach einer anderen Bibliothek umschauen sollte *schauder*
-
Sing sogar 10.
Die WinAPI geizt auch nicht mit Parametern.
-
Danke Pumuckl,
ich hab jetzt in den Compilereinstellungen "nach 64 Bit Portabilitätsproblemen suchen" abgeschaltet. Damit ist das "__w64" weg. Der Fehler bleibt der gleiche.
d:\development\testsource\opencvbasis\histogramm\histogramm.cpp(27) : error C2665: "cv::calcHist": Durch keine der 2 Überladungen konnten alle Argumenttypen konvertiert werden. 1> c:\bibliotheken\opencv2.1.0\include\opencv\cv.hpp(412): kann 'void cv::calcHist(const cv::Mat *,int,const int *,const cv::Mat &,cv::MatND &,int,const int *,const float **,bool,bool)' sein 1> c:\bibliotheken\opencv2.1.0\include\opencv\cv.hpp(418): oder "void cv::calcHist(const cv::Mat *,int,const int *,const cv::Mat &,cv::SparseMat &,int,const int *,const float **,bool,bool)" 1> bei Anpassung der Argumentliste '(cv::Mat *, int, int [2], cv::Mat, cv::MatND, int, int [2], float *[2], bool, bool)'Statt mit dem C-Cast geht es auch mit const_cast, trotzdem ist mir schleierhaft, wozu ich den überhaupt brauche?
calcHist( const_cast<const Mat*>(&hsv), 1, const_cast<const int*>(channels), Mat(), // do not use mask hist, 2, const_cast<const int*>(histSize), const_cast<const float**>(ranges), true, // the histogram is uniform false );
-
ein T** kann nicht implizit in ein const T** konvertiert werden. Andernfalls würde die const-Korrektheit nicht gewahrt bleiben.
-
Stimmt,
dann ist das const_cast<> nur für den ranges-Parameter nötig. Bei den anderen Parametern kann ich auf den Cast verzichten.
Danke
DJohn
-
Das sieht wie ein Fehler in der Schnittstellenspezifikation aus. Der Paramter sollte eher
const float* const* rangesheißen. Dann ist auch kein Cast notwendig.