2017-04-05 6 views
0

j'ai donc une fonction avec le prototypeparamètres de la fonction C++ compiler wont

double Solution::bisect 
(
    double xLeft, 
    double xRight, 
    double epsilon, 
    double f(double x, EquCoeffs coeffsStruct), 
    bool &error 
); 

où la fonction f est prototypé comme celui-ci

double Solution::f(double x, EquCoeffs coeffsStruct); 

L'erreur que je reçois dans Visual Studio est argument of type "double(Solution::*)(double x, Solution::EquCoeffs coeffsStruct)" is incompatible with parameter of type "double(*)(double x, Solution::EquCoeffs coeffsStruct)"

qui se produit lorsque j'essaie d'appeler bisect(xLeft, xRight, epsilon, f, error);xRightxLeftepsilon, sont de type double et error est de type bool.

Pourquoi ne pas compiler? Je ne suis pas sûr de comprendre l'erreur. Comment est un double(Solution::*) différent de double(*)?

+1

S'il vous plaît montrer un [mcve]. L'erreur provient de la façon dont vous appelez la fonction. Vous essayez de l'appeler avec un pointeur vers une fonction membre alors qu'il attend un pointeur vers une fonction libre – user463035818

+0

Comment puis-je faire en sorte qu'il attende un pointeur sur une fonction membre à la place? – Airhead

+0

... btw l'erreur vous dit déjà tout ce que vous devez savoir;) – user463035818

Répondre

3

pointeurs de fonction peut être fastidieux de travailler avec, c'est là typedef s être utiles:

typdef R (*FREE_FUNC)(ARGS); 

fait FREE_FUNC un alias pour les pointeurs de fonction de type R(*)(ARGS), à savoir les fonctions avec le paramètre ARGS et R type de retour. Cela peut sembler un peu étrange, que le nouveau nom apparaisse au milieu sur le typdef. Cependant, partout ailleurs en utilisant des pointeurs de fonction est alors beaucoup plus agréable, par exemple

typedef void (*LOGGER)(R,ARGS); 
R decorate(FREE_FUNC func,LOGGER logger,ARGS args){ 
    R result = func(args); 
    logger(result,args); 
    return result; 
} 

pointeurs de fonctions membres sont différents, parce que vous avez besoin d'un objet pour les appeler:

struct Foo { 
    void foo(){std::cout << "moo \n";} 
    void moo(){std::cout << "xyz \n";} 
}; 

typedef void (Foo::*FOO_MEMBER_FUNC)(); 

void fooCaller(Foo f,FOO_MEMBER_FUNC mf){ 
    (f.*mf)(); 
    // ... or ... 
    Foo* f_ptr = &f; 
    (f_ptr->*mf)(); 
} 

int main() { 
    FOO_MEMBER_FUNC foo_ptr = &Foo::foo; 
    FOO_MEMBER_FUNC moo_ptr = &Foo::moo; 
    Foo f; 
    fooCaller(f,foo_ptr); 
    fooCaller(f,moo_ptr); 
} 

Je dois aussi mentionner, qu'il y sont de meilleurs moyens de transmettre des fonctions. Vous pouvez jeter un oeil à std::function.

+0

Je suis au courant; malheureusement, mes exigences dictent que je le fais en passant un paramètre de fonction d'une telle manière. – Airhead

+0

@Airhead pas sûr si je vous comprends. Si la réponse n'a pas aidé, vous devez fournir le code ([mcve]) – user463035818

+0

Ma solution a fini par être juste pour utiliser une fonction gratuite à la place. Merci quand même! – Airhead