C++函数参数不会编译
C++ function parameters wont compile
所以我有一个原型函数
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(*)
有何不同?
函数指针使用起来可能很乏味,这就是 typedef
派上用场的地方:
typdef R (*FREE_FUNC)(ARGS);
使FREE_FUNC
成为R(*)(ARGS)
类型函数指针的别名,即具有ARGS
参数和R
return类型的函数。新名称出现在 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.
所以我有一个原型函数
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(*)
有何不同?
函数指针使用起来可能很乏味,这就是 typedef
派上用场的地方:
typdef R (*FREE_FUNC)(ARGS);
使FREE_FUNC
成为R(*)(ARGS)
类型函数指针的别名,即具有ARGS
参数和R
return类型的函数。新名称出现在 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.