Ich bin ziemlich neu in C++, und wahrscheinlich hatte ich naive Probleme. Ich weiß, dass es andere smilare Fragen gibt, die mit (anscheinend mir) komplexeren Problemen verbunden sind als meine. Ich versuche, eine Firmware für Arduino zu machen, mit C++ und ich habe mich mit den Überladungsfehlern verletzt.C++ - Grundlagen: ungelöst überladene Funktion Typ
ich diesen Code haben definieren in einer CPP-Datei:
void class1::functionA(void)
{
object2.functionOfClass2(class1::functionB);
}
Class1 wird initialisiert, wie:
class class1
{
public:
void functionA(void);
void functionB(void);
private:
}
Und in der Zusammenstellung gibt
no matching function for call to 'class2::functionOfClass2(<unresolved overloaded function type>)'
Übersetzen ins das praktische:
in meinem Code Ich bin mit der Draht Bibliothek innerhalb einer Elementfunktion des class1 für eine Arduino Bibliothek, wo im Beispiel der object2 und class2 ist jeweils der Draht Objekt der Klasse TwoWire.
Ich habe die Notwendigkeit die Draht Bibliothek innerhalb einer Elementfunktion meiner class1 zu nennen. Diese Lösung ist eine Konsequenz aus früheren Lektionen, in denen ich gelernt habe, dass ich eine Elementfunktion von class1 innerhalb einer Nichtmitgliedsfunktion nicht aufrufen kann, da die Instanziierung der Nichtmitgliedsfunktion nicht vorgenommen werden kann, da die Klasse nicht ist instanziiert als ein Objekt noch, und der Compiler hat keine Ahnung, wie dies zu tun ist.
Aber den Draht benennend. Objekt in einer Member-Funktion, dachte ich, das war möglich. Aber das Denken besser es eigentlich beim Passieren der class1 Mitglied Funktionszeiger auf die Draht Funktion kann der Compiler nicht wissen, was zu Drähten passiert, so dass die folgende ist FALSCH:
void class1::functionA(void)
{
Wire.onRequest(class1::functionB); //wrong
}
wo die onRequest akzeptieren void (*)(void)
Funktionen.
So mit
void class1::functionA(void)
{
Wire.onRequest(&class1::functionB); //wrong
}
Der Fehler versucht wurde:
error: no matching function for call to 'TwoWire::onRequest(void (class1::*)())' candidates are: void TwoWire::onRequest(void (*)())
es eine Möglichkeit, die Dinge arbeiten zu machen ist? Wenn ich statische und Initialisierungsliste sage, bin ich auf dem richtigen Weg mit den richtigen Schlüsselwörtern?
Dank
Hatte meine Antwort zu löschen. Ich denke nicht, dass dies einfach machbar ist. Sie müssen 'this' Ihrer' class1' -Instanz an 'onRequest' übergeben, und Sie können das einfach nicht tun, wenn es' void (*)() 'akzeptiert (keine Parameter erlaubt). Eine gut entworfene Bibliothek würde statt dessen "onRequest" als onRequest (void (* callback) (void *), void * context) definieren und "this" als "context" übergeben. –
Der einzige Weg dies zu tun ist, wenn es nur eine 'class1'-Instanz in Ihrer gesamten Anwendung gibt - dann können Sie diese Instanz bedingungslos ersetzen und 'functionB' darauf aufrufen. –