所以我有一个原型
的功能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
的类型为double
,error
的类型为bool
。
为什么不能编译?我不确定我是否理解错误。 double(Solution::*)
如何与double(*)
不同?
答案 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。