g++: no matching function call to '...'
-
Hi Leute,
bin neu hier im Forum und möchte euch alle Grüßen:)
Nun komme ich auch gleich mit einem Problem daher, dem ich einfach nicht Herr werde. Mir sind die Ideen ausgegangen und das Netz spuckt auch keine brauchbaren Hinweise aus.Hier die Fehlermeldung vom g++:
/home/hymir/Entwicklung/cxx/Projekte/TestQTstuff/testb.cpp:21: Fehler:no matching function for call to 'TestB::setField(int*&, QPair<int, int>&)' setField(this->y, pair); ^ /home/hymir/Entwicklung/cxx/Projekte/TestQTstuff/testb.cpp:22: Fehler:no matching function for call to 'TestB::setField(int*&, QPair<int, int>&)' setField(this->x, pair); ^Und hier das passend Minimalbeispiel:
(Datei testa.h)#include <QPair> #ifndef TESTA_H #define TESTA_H class TestA { public: TestA(); virtual void fromPair(QPair<int, int>& pair); int* getX(); int* getY(); protected: int* x; int* y; void setField(int* field, QPair<int, int>& pair); }; #endif // TESTA_H(Datei testa.cpp)
#include "testa.h" TestA::TestA() :x(NULL), y(NULL) { } void TestA::setField(int *field, QPair<int, int> &pair) { (*field) = pair.first * pair.second; } void TestA::fromPair(QPair<int, int> &pair) { setField(this->x, pair); setField(this->y, pair); } int* TestA::getY() { return y; } int* TestA::getX() { return x; }(Datei testb.h)
#include <QString> #include "testa.h" #ifndef TESTB_H #define TESTB_H class TestB : public TestA { public: TestB(); void fromPair(QPair<int, int>& pair); QString* getOrig(void); protected: QString* orig; void setField(QString*& field, QPair<int, int> &pair); }; #endif // TESTB_H(Datei testb.cpp)
#include "testb.h" TestB::TestB() :orig(NULL) { } void TestB::setField(QString *&field, QPair<int, int> &pair) { field = new QString(); field->append('('); field->append(pair.first); field->append(", "); field->append(pair.second); field->append(')'); } void TestB::fromPair(QPair<int, int> &pair) { //TestA::fromPair(pair); setField(this->y, pair); setField(this->x, pair); setField(this->orig, pair); }In der main-funktion erstelle ich ein QPair objekt und ein TestB objekt.
Danach rufe ich testbobjekt.fromPair(myPair) auf, das wars.
Ich habe hier zwar QT Klassen verwendet, sollte aber nicht von Bedeutung sein, wenn man sie gegen irgendetwas anderes austauscht.Der oben genannte Fehler sieht aus als wäre er ein typischer Fehler in C++.
Bedanke mich herzlich im Voraus für eure Hilfe,
Beste Grüße.
-
void setField(QString*& field, QPair<int, int> &pair);setField(this->y, pair);int* y;Siehst du, was da nicht zusammen passt?
P.S.: Referenzen auf Zeiger auf Zeichenketten? Ist das normal in Qt?
-
Hi, Danke für deine Antwort.
Die entsprechende Methode wird vorn TestA geerbt und ist protected.
void setField(int* field, QPair<int, int>& pair);Sie sollte somit verfügbar sein in TestB: public TestA.
Ob Referenzen auf Zeiger auf Strings gängige Praxis in QT sind weiß ich nicht.
Spielt hier aber auch keine Rolle.
Das Testprogramm ist natürlich vollkommener Humbug, schon klar.
Es handelt sich ja nur um ein Minimalbeispiel, das möglichst originalgetreu
die Situation in meinem Projekt nachstellt um genau den "gewünschten" Fehler zu provozieren
Was ich nicht verstehe ist, dass er die og. Methode aus der Superklasse nicht zu kennen scheint.
Vorallem bleibt der Fehler, wenn ich diese Methode in der Superklasse public mache.
-
Du überlädst die Methode aus der Basisklasse (und damit verdeckst du alle Methoden gleichen Namens der Basisklasse).
Packe noch einusing TestA::setField;in die Klassendefinition von der abgeleiteten Klasse TestB - s. z.B. using Declaration.
-
Vielen Dank für den Hinweis,
diese Kleinigkeit hab ich total übersehen:)Nun läuft alles wie gewünscht.
Soll ich an den Titel "gelöst" anhängen, oder wie markiere ich den entsprechend?
-
V2-Biker schrieb:
Soll ich an den Titel "gelöst" anhängen, oder wie markiere ich den entsprechend?
Kannst du so machen, aber kannst du auch einfach so lassen wie es ist. Manchmal kommen später auch noch nützliche allgemeine Tipps oder bessere Lösungen in Threads, deren eigentliche Frage schon gelöst ist.
-
Alles klar.
Nochmal vielen Dank, ihr seid klasse!