std::pair frisst Klasse nicht
-
Huhu.

Würd gern meine kleine Punkt-Klasse in den std::pair Container packen.
Doch leider meckert std::pair dann rum, weil es für diese keinen Standardkonstruktor hätte:
C:\Programme\Microsoft Visual Studio 8\VC\include\utility(30) : error C2512: 'pointXY::pointXY' : no appropriate default constructor available C:\Programme\Microsoft Visual Studio 8\VC\include\utility(30) : while compiling class template member function 'std::pair<_Ty1,_Ty2>::pair(void)' with [ _Ty1=pointXY, _Ty2=pointXY ] .\Rue_C_Ext.cpp(881) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled with [ _Ty1=pointXY, _Ty2=pointXY ]Klasse:
class pointXY { public: pointXY(int X, int Y) { x = X; y = Y; } ~pointXY(); bool pointXY::operator== (const pointXY& otherPoint) const { if ((this->x == otherPoint.x) && (this->y == otherPoint.y)) return true; else return false; } int x; int y; };Codezeilen, die zum Fehler führen:
pointXY test_p1 = pointXY(1,1); pointXY test_p2 = pointXY(2,2); std::pair<pointXY,pointXY> testpair; // compiler errorMit einem std::vector funktioniert alles wunderbar...

std::vector<pointXY> testvec; testvec.push_back(test_p1); testvec.push_back(test_p2);Wie krieg ich nur die Klasse std::pair kompatibel? *kopfkratz*
-
Spendiere ihr einen Default-Constructor. Das ist einer, der keine Parameter entgegennimmt.
Oder initialisiere so, dass keine Default-Erzeugung notwendig ist:
std::pair<pointXY,pointXY> testpair(test_p1, test_p2);
-
Ui. Das ging schnell!
Danke!
Leider wirft er mir auch damit den Compiler Error:
std::pair<pointXY,pointXY> testpair = make_pair(test_p1,test_p2);Mit dem leeren Konstruktor tut's allerdings...
Hmm... nur irgendwie hässlich... ein Konstruktor, der zu nix gut ist und nur verwirrt....

Aber löööft immerhin. Danke nochmal!
-
Samhayne schrieb:
Leider wirft er mir auch damit den Compiler Error:
std::pair<pointXY,pointXY> testpair = make_pair(test_p1,test_p2);Das ist auch nicht der Code, den ich gepostet habe.
-
Ich weiß... dachte, Du hättest das make_pair einfach vergessen davorzupinseln.
Wusste nicht, daß die Notation auch funktioniert... aber sollte doch dasselbe sein.pointXY test_p1 = pointXY(1,1); pointXY test_p2 = pointXY(2,2); std::pair<pointXY,pointXY> testpair(test_p1, test_p2);bringt mir jedenfalls denselben compilerfehler wie oben.
(wenn ich den Standardkonstruktor wieder wegkommentiere)
-
Samhayne schrieb:
Mit dem leeren Konstruktor tut's allerdings...
Was nur logisch ist.
pointXY p;Wird nur klappen, wenn ein Standardkonstruktor existiert.
Warum? Weil p irgendwie initialisiert wird, hier Konkret mit dem Standardkonstruktor.std::pair<pointXY,pointXY> testpair;Wird als Member zwei Elemente vom Typ pointXY halten. Die müssen irgendwie initialisiert werden.
pointXY test_p1 = pointXY(1,1); pointXY test_p2 = pointXY(2,2); std::pair<pointXY,pointXY> testpair(test_p1, test_p2);Hier wird die initialisierung explizit angegeben (Was wohl zum Aufruf der jeweiligen Kopierkonstruktoren führt). Und make_pair(test_p1,test_p2) scheint wohl auch die Variablen ohne Konstruktorangabe zu definieren...
Samhayne schrieb:
Hmm... nur irgendwie hässlich... ein Konstruktor, der zu nix gut ist und nur verwirrt....

Er ist schon zu etwas gut: Wenn keine explizite Initialisierung erfolgt kann nur der Standardkonstruktor herhalten. Der Compiler ist leider nicht hellsehend

cu André
-
Um meine Ehre halbwegs zu retten *duck* ...
std::pair<pointXY,pointXY> testpair;... hatte ich nur für das Beispiel oben so geschrieben.
Kopfzerbrechen bereitete es mir aber, als der error hier auftauchte:
std::pair<pointXY,pointXY> testpair = make_pair(test_p1,test_p2);Daß obiges nicht tun kann, seh ich gleich ein.

-
Samhayne schrieb:
Kopfzerbrechen bereitete es mir aber, als der error hier auftauchte:
std::pair<pointXY,pointXY> testpair = make_pair(test_p1,test_p2);Diese Zeile sollte sich auch dann übersetzen lassen, wenn pointXY über keinen Defaultkonstruktor verfügt. Und mit dem von Dir verwendeten VC8 tut sie das auch.
Bist Du sicher, dass die Zeile 881 in Rue_C_Ext.cpp so aussieht, wie von Dir angegeben? Oder steht da vielleicht:
std::pair<pointXY,pointXY> testpair; // Zeile 881 testpair = make_pair(test_p1,test_p2);Dies würde zu dem von Dir genannten Compilerfehler führen.
-
Ja... hab's grad extra nochmal getestet
Klasse:
class pointXY { public: // pointXY() // { // // } pointXY(int X, int Y) { x = X; y = Y; } ~pointXY() { } bool pointXY::operator== (const pointXY& otherPoint) const { if ((this->x == otherPoint.x) && (this->y == otherPoint.y)) return true; else return false; } int x; int y; };Testcode:
pointXY test_p1 = pointXY(1,1); pointXY test_p2 = pointXY(2,2); std::pair<pointXY,pointXY> testpair = make_pair(test_p1, test_p2); //Line 882Fehler:
C:\Programme\Microsoft Visual Studio 8\VC\include\utility(30) : error C2512: 'pointXY::pointXY' : no appropriate default constructor available C:\Programme\Microsoft Visual Studio 8\VC\include\utility(30) : while compiling class template member function 'std::pair<_Ty1,_Ty2>::pair(void)' with [ _Ty1=pointXY, _Ty2=pointXY ] .\Rue_C_Ext.cpp(882) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled with [ _Ty1=pointXY, _Ty2=pointXY ]
-
Abgesehen von pointXY::operator== (pointXY:: hat da nichts zu suchen) schluckt der GNU Compiler das auch.
-
Keine Ahnung, was da schief läuft.
Ohne Standardconstruktor, schmeisst er mich an der Stelle raus.
Mit geht's.Kann höchstens noch meine Includes angeben:
#include "windows.h"
#include <string>
#include <boost/tr1/tuple.hpp>
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python.hpp>
#include <boost/format.hpp>#include <vector>
//#include "cv.h"
//#include "highgui.h"
//#include "cvaux.h"
//#include "pixelList.h"
//#include "Logfile.h"
//#include "rueTools.h"#include <set>
#include <math.h>Fellhuhn schrieb:
pointXY:: hat da nichts zu suchen
Getötet!
