C ++函数参数不会编译

时间:2017-04-05 16:10:05

标签: c++ function-pointers function-parameter

所以我有一个原型

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

其中函数f的原型是这样的

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

我在Visual Studio中遇到的错误是argument of type "double(Solution::*)(double x, Solution::EquCoeffs coeffsStruct)" is incompatible with parameter of type "double(*)(double x, Solution::EquCoeffs coeffsStruct)"

当我尝试拨打bisect(xLeft, xRight, epsilon, f, error);时发生 其中xRight xLeft epsilon的类型为doubleerror的类型为bool

为什么不能编译?我不确定我是否理解错误。 double(Solution::*)如何与double(*)不同?

1 个答案:

答案 0 :(得分:3)

函数指针可能很繁琐,这就是typedef派上用场的地方:

typdef R (*FREE_FUNC)(ARGS);

使FREE_FUNC成为R(*)(ARGS)类型函数指针的别名,即具有ARGS参数和R返回类型的函数。看起来有点奇怪,新名称出现在typdef的中间。但是,其他地方使用函数指针的情况要好得多,例如

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

成员函数指针是不同的,因为你需要一个对象来调用它们:

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);
}

我还应该提一下,有更好的方法来传递函数。您可以查看std::function