Je suis tout à fait nouveau pour C++, et probablement j'avais des problèmes naïfs. Je sais qu'il y a d'autres questions smilar, mais qui sont liées à (semble-t-il) un problème plus complexe que le mien. J'essaie de faire un firmware pour Arduino, en utilisant C++ et je me suis blessé avec les erreurs de surcharge.C++ base de: type de fonction non résolue surcharge
Je le code définit dans un fichier cpp:
void class1::functionA(void)
{
object2.functionOfClass2(class1::functionB);
}
Le Class1 est initialisé:
class class1
{
public:
void functionA(void);
void functionB(void);
private:
}
Et dans la compilation donne
no matching function for call to 'class2::functionOfClass2(<unresolved overloaded function type>)'
Traduire en la pratique:
dans mon code J'utilise la bibliothèque de fil dans une fonction de membre du Class1 pour une bibliothèque Arduino, où, dans l'exemple le object2 et class2 sont respectivement le Fil objet de la classe TwoWire.
J'ai la nécessité d'appeler la bibliothèque de fildans une fonction de membre de mon Class1. Cette solution est une conséquence d'un cours précédent, où j'ai appris que je ne peux pas appeler une fonction de membre de Class1 dans une fonction non-membre, parce que l'instanciation de la fonction non-membre ne peut être que la classe n'est pas instancié comme un objet encore, et le compilateur n'a aucune idée sur la façon de le faire.
Mais appeler le fil . objet à l'intérieur d'une fonction de membre, je pensais que c'était possible. Mais penser mieux, en fait, lors du passage du pointeur de fonction membre classe1 au fil fonction, le compilateur ne peut pas savoir ce qu'il faut passer à fil, et donc ce qui suit est MAUVAIS:
void class1::functionA(void)
{
Wire.onRequest(class1::functionB); //wrong
}
où le onRequest accepte void (*)(void)
fonctions.
donc essayer avec
void class1::functionA(void)
{
Wire.onRequest(&class1::functionB); //wrong
}
L'erreur est devenu:
error: no matching function for call to 'TwoWire::onRequest(void (class1::*)())' candidates are: void TwoWire::onRequest(void (*)())
Il y a une façon de faire ces choses fonctionnent? Si je dis statique et liste initialiseur, je suis sur la bonne voie avec les bons mots-clés?
Merci
Had supprimer ma réponse. Je ne pense pas que ce soit clairement faisable. Vous devez passer 'this' de votre instance' class1' à 'onRequest', et vous ne pouvez pas le faire si vous acceptez' void (*)() '(aucun paramètre n'est autorisé). Une bibliothèque bien conçue définirait à la place 'onRequest' comme' onRequest (void (* callback) (void *), void * context) 'à la place, et vous passeriez' this' sous la forme 'context'. –
La seule façon de faire cela est s'il n'y a qu'une seule instance 'class1' dans votre application entière - alors vous pouvez substituer cette instance inconditionnellement et appeler' functionB'. –