Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;函数参数无法编译_C++_Function Pointers_Function Parameter - Fatal编程技术网

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 expect
Solution::f
,我得到了
限定名是不允许的
。我做了一些谷歌搜索,显然我不允许在这里指定类名?给出了什么?请显示一个。错误来自于你调用函数的方式。你试图用指向成员函数的指针调用它,而它需要指向自由函数的指针。我怎么能改为使用指向成员函数的指针?…顺便说一句,错误已经告诉了您需要知道的一切;)好的,但是当我将函数的签名更改为expect
Solution::f
时,我得到了
限定名是不允许的
。我做了一些谷歌搜索,显然我不允许在这里指定类名?给出了什么我知道;不幸的是,我的要求要求我以这种方式传递函数参数。@Airhead不确定我是否理解你。如果答案没有帮助,你需要提供代码()我的解决方案最终只是使用一个免费函数。不过,谢谢!我知道;不幸的是,我的要求要求我以这种方式传递函数参数。@Airhead不确定我是否理解您。如果答案没有帮助,您需要提供代码()我的解决方案最终只是使用一个免费函数。谢谢!