Was macht man mit solch einer Fehlermeldung?



  • Hallo, ich bin gerade etwas genervt von folgender Fehlermeldung

    E1790	the default constructor of "Rect<GObject::val_t>" cannot be referenced -- it is a deleted function	
    
    

    Weder gibt es solch einen Konstruktor, noch gibt es eine "deleted function", wüsste jetzt nicht mal, was das ist.
    Alles, was ich gemacht habe, im Memberbereich der Klasse GObject ein Rect<val_t> vertexRect_;hinzuzufügen.



  • Es gibt keinen Default-Konstruktor für Rect<val_t>, weil der explizit gelöscht wurde. Wahrscheinlich braucht Rect<val_t> Parameter für seine Konstruktion.



  • Die Klasse Rect<val_t> hat keinen Default-Konstruktor, d.h. du mußt in dem Konstruktor deiner Klasse den passenden Konstruktor für den Member vertexRect_ aufrufen (in der Initialisierungsliste). Alternativ direkt beim Member zuweisen (wenn es denn mit konstanten Werte initialisiert werden soll).



  • Danke, aber warum jetzt? Die Klasse Rectist genauso aufgebaut wie alle anderen, wird benutzt wie alle anderen, warum gibt es jetzt ein Problem?
    Das ist doch hier ein Default-Konstruktor?
    Rect() = default;


  • Mod

    Der Compiler wird schon recht haben. Du übersiehst irgendetwas oder machst irgendetwas an falscher Stelle. Ohne Code kann man nichts konkretes sagen. Erstell' doch bitte ein (bis auf den Fehler) compilierbares Minimalbeispiel, das möglichst keine Codezeile enthält die nichts mit dem Fehler zu tun hat. Und poste das dann hier, dann werden wir den Fehler schnell finden. Wobei sich solche Probleme erfahrungsgemäß auch oft von alleine lösen, weil man beim Reduzieren des Codes den Fehler selber findet.



  • Mehr Code, bitte. Dass die Klasse einfach keinen Default-Konstruktor hat, kann eigentlich nicht sein, weil er dann einfach nicht existiert, und nicht deleted ist. Vielleicht enthält die Klasse Referenzen oder const Membervariablen.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Der Compiler wird schon recht haben. Du übersiehst irgendetwas oder machst irgendetwas an falscher Stelle.

    Das ist schon klar, aber ich habe keine Vorstellung was das sein könnte. Die betreffende Klasse schaut so aus:

    template<typename T>
    class Rect
    {
    	using val_t = T;
    public:
    	Rect() = default;
    	Rect(const val_t x0, const val_t y0, const val_t x, const val_t y)
    		: p0_{ x0, y0 }, p_{ x, y } {}
    	Rect(const Point2D<val_t>& p0, const Point2D<val_t>& p)
    		: p0_{ p0 }, p_{ p } {}
    
    	val_t left() const { return p0_.x(); }
    	val_t bottom() const { return p0_.y(); }
    	val_t right() const { return p_.x(); }
    	val_t top() const { return p_.y(); }
    	val_t& left() { return p0_.x(); }
    	val_t& bottom() { return p0_.y(); }
    	val_t& right() { return p_.x(); }
    	val_t& top() { return p_.y(); }
    
    	Point2D<val_t> p0() const { return p0_; }
    	Point2D<val_t> p() const { return p_; }
    	Point2D<val_t>& p0() { return p0_; }
    	Point2D<val_t>& p() { return p_; }
    
    private:
    	const Point2D<val_t>& p0_; //EDIT: oh, ich Idiot! Das sehe ich jetzt erst!?
    	const Point2D<val_t>& p_ //Da muss ich ja ganz schön verhuscht gewesen sein!
    };
    

    Selbst wenn sie im eigenen Header ist, kann ich sie nicht mal im der main() aufrufen.

    EDIT: siehe Edit. Ich glaub ich muss zum Augenarzt.



  • @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    const Point2D<val_t>& p0_;

    Was soll ein Defaultkonstruktor damit machen?



  • Jepp. Mir selbst unvorstellbar, wie ich das nicht gesehen habe. Sorry für die Aufregung.


  • Mod

    Deine Schnittstelle ist allgemein konfus. Du öffnest deine privaten const Referenzen zum unkontrollierten Schreiben? Oder umgekehrt gesehen: Du hast const-Referenz-Member?
    Ich habe den Eindruck, du möchtest eher

    struct Rect
    {
        Point2D p0, p_;
    };
    

    Vielleicht noch angereichert mit den top, left, bottom, right Methoden.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Point2D p0, p_;

    Machen dann nicht vielleicht auch Point2D topleft, bottomright; oder Point2d bottomleft, topright mehr Sinn als p0 und p?



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Deine Schnittstelle ist allgemein konfus.

    Ich habe hier noch keinen Code gesehen, der ohne spitze Bemerkungen durchgekommen ist. Wenn er nicht zu meinem Projekt passt, werde ich es schon selbst erfahren. Mit "konfus" kann ich jedenfalls herzlich wenig anfangen, weshalb ich mir darum jetzt auch keinen Kopf machen werde.


  • Mod

    @wob sagte in Was macht man mit solch einer Fehlermeldung?:

    @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Point2D p0, p_;

    Machen dann nicht vielleicht auch Point2D topleft, bottomright; oder Point2d bottomleft, topright mehr Sinn als p0 und p?

    Vielleicht. Ich war mir nicht so sicher, was die Absicht hinter der Klasse sein soll (was halt genau das Problem ist, dass sich ein Leser nicht sicher ist). Geht es um schnöde Speicherung von zwei Punkten? Oder geht es um die Verbindung zwischen den internen Daten und der semantischen Interpretation als Rechteck mit den Konzepten von ausgerichteten Seiten und Ecken?



  • Es geht MIR darum, ein sicheres Konstrukt aus vier Werten zu haben, ohne unsicher zu sein, wie x0, y0 etc zu deuten ist.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    Ich habe hier noch keinen Code gesehen, der ohne spitze Bemerkungen durchgekommen ist. Wenn er nicht zu meinem Projekt passt, werde ich es schon selbst erfahren. Mit "konfus" kann ich jedenfalls herzlich wenig anfangen, weshalb ich mir darum jetzt auch keinen Kopf machen werde.

    Konfus: Selbstwiedersprüchlich. Du hast const-Member, bietest aber ausdrücklich Funktionen zu deren Veränderung an. Was nicht funktionieren wird. Deshalb wird es auch nicht lange dauern, bis du mit deinem unbesorgten Kopf gegen die Wand rennst.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Du hast const-Member,

    const-Member? Du meinst die fehlerhafte Zeile const Point2D<val_t>& p0_;?


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    Es geht MIR darum, ein sicheres Konstrukt aus vier Werten zu haben, ohne unsicher zu sein, wie x0, y0 etc zu deuten ist.

    Dann lass doch die Schnittstelle zu x0, y0, etc. weg und biete nur die high-Level Interpretation mit "links", "rechts", etc an! Wie das Rechteck intern repräsentiert ist, sollte kein Teil der öffentlichen Schnittstelle sein. Wenn es nämlich Teil der öffentlichen Schnittstelle ist, dann kannst du die interne Repräsentation in Zukunft nicht mehr ändern, weil du dann allen abhängigen Code kaputt machen würdest.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Du hast const-Member,

    const-Member? Du meinst die fehlerhafte Zeile const Point2D<val_t>& p0_;?

    Welche Eigenschaften deiner Klasse nun falsch sind und welche richtig, kannst nur du wissen. Ich als Leser kann nur sagen, dass die gezeigten Eigenschaften widersprüchlich sind und daher mindestens eine davon falsch sein muss.



  • Ich würde die Klasse aber gerne auch mit vier Werten füllen. Ich habe sie zu meiner eigenen Erleichterung geschrieben, weil mir die vier Werte auf Dauer zu undurchsichtig wurden.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Welche Eigenschaften deiner Klasse nun falsch sind und welche richtig, kannst nur du wissen. Ich als Leser kann nur sagen,

    Jesus! Das war der Fehler, keine Absicht! Ehrlich, machmal frickelt man lieber eine Woche an einem Problem herum, als sich hier zu melden.


  • Mod

    Du hast offenbar nicht verstanden, was ich dir sagen möchte, was an deinem Design nicht stimmt. Vermutlich aus irgendeinem falsch verstandenem Ehrgefühl, dass das Aufzeigen einer Schwäche in deinem Code irgendwie als persönlichen Angriff wahr nimmt, anstatt inhaltlich über die Kritik nachzudenken.


Anmelden zum Antworten