C++ C++;函数参数无法编译
所以我有一个关于原型的函数C++ C++;函数参数无法编译,c++,function-pointers,function-parameter,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
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中遇到的错误是“double(Solution::*)(double x,Solution::eqcoeffs coeffstruct)”类型的参数与“double(*)(double x,Solution::eqcoeffs coeffstruct)”类型的参数不兼容。
当我试图调用二分法(xLeft,xRight,epsilon,f,error)时会发生这种情况代码>
其中xRight
xLeft
epsilon
,为类型double
,error
为类型bool
为什么这个不能编译?我不确定我是否理解这个错误。
double(解决方案:*)
与double(*)
有何不同?函数指针的使用非常繁琐,这就是typedef
的用武之地:
typdef R (*FREE_FUNC)(ARGS);
使FREE\u FUNC
成为R(*)(ARGS)
类型函数指针的别名,即带有ARGS
参数和R
返回类型的函数。它可能看起来有点奇怪,新的名字出现在Type的中间。然而,例如,在其他地方使用函数指针就更好了
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);
}
structfoo{
void foo(){std::cout函数指针的使用可能会非常繁琐,这正是typedef
s派上用场的地方:
typdef R (*FREE_FUNC)(ARGS);
使<代码> Fr.FunFunc < /> >函数类型指针:<代码> R(*)(ARGs),ie函数用<代码> ARGs<代码>参数> <代码> r>代码>返回类型。
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);
}
structfoo{
void foo(){std::cout请显示一个。错误来自于您调用函数的方式。您尝试使用指向成员函数的指针调用它,而它需要指向自由函数的指针。我如何使它期望指向成员函数的指针呢?…顺便说一句,错误已经告诉了您需要知道的一切;)好的,但是当我更改函数的签名时o expectSolution::f
,我得到了限定名是不允许的
。我做了一些谷歌搜索,显然我不允许在这里指定类名?给出了什么?请显示一个。错误来自于你调用函数的方式。你试图用指向成员函数的指针调用它,而它需要指向自由函数的指针。我怎么能改为使用指向成员函数的指针?…顺便说一句,错误已经告诉了您需要知道的一切;)好的,但是当我将函数的签名更改为expectSolution::f
时,我得到了限定名是不允许的
。我做了一些谷歌搜索,显然我不允许在这里指定类名?给出了什么我知道;不幸的是,我的要求要求我以这种方式传递函数参数。@Airhead不确定我是否理解你。如果答案没有帮助,你需要提供代码()我的解决方案最终只是使用一个免费函数。不过,谢谢!我知道;不幸的是,我的要求要求我以这种方式传递函数参数。@Airhead不确定我是否理解您。如果答案没有帮助,您需要提供代码()我的解决方案最终只是使用一个免费函数。谢谢!