C++ C++;错误:没有用于调用的匹配函数

C++ C++;错误:没有用于调用的匹配函数,c++,class,bisection,C++,Class,Bisection,我试图用二分法解一个二次方程。当尝试计算根时,我得到了这样一个错误:“调用没有匹配函数” ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "assign4.h" #include <iostream

我试图用二分法解一个二次方程。当尝试计算根时,我得到了这样一个错误:“调用没有匹配函数”

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "assign4.h"
#include <iostream>
#include <cmath>

using namespace std;

double solution::bisect (double xLeft, double xRight, double epsilon, double func(double), bool& error) {
   double xMid;
   double fLeft, fRight;
   double fMid;

   fLeft = f(xLeft);
   fRight = f(xRight);

   error = (fLeft * fRight) > 0;
   if (error)
      return -999.0;

   while (fabs (xLeft - xRight) > epsilon) {
      xMid = (xLeft + xRight) / 2.0;
      fMid = f (xMid);

      if (fMid == 0.0)
         return xMid;
      else if (fLeft * fMid < 0.0)
         xRight = xMid;
      else
         xLeft = xMid;

      cout << "New Interval is [" << xLeft << ", " << xRight << "]" << endl;
   }

return (xLeft + xRight) / 2.0;
}

double solution::f (double x) {
   return ((5 * pow(x,2.0)) + (5 * x) + 3);
}
#包括“assign4.h”
#包括
#包括
使用名称空间std;
双解::二分法(双xLeft、双xRight、双epsilon、双func(double)、bool和error){
双xMid;
双重打击,恐惧;
双fMid;
fLeft=f(xLeft);
恐惧=f(右);
错误=(弗莱夫特*弗里特)>0;
如果(错误)
return-999.0;
while(fabs(xLeft-xRight)>ε){
xMid=(xLeft+xRight)/2.0;
fMid=f(xMid);
如果(fMid==0.0)
返回xMid;
否则如果(fLeft*fMid<0.0)
xRight=xMid;
其他的
xLeft=xMid;

cout第四个参数是函数指针

double bisect(double, double, double, double f(double), bool&);
调用此函数时:

root = s.bisect (s.xLeft, s.xRight, s.epsilon, s.f, s.error);
<> P>虚构的代码> double f(double)< /> >不是与该参数相同的类型,因为这是C++成员函数而不是静态的,所以在编译时,这个参数被添加这个成员函数。


键入向函数添加静态关键字。

函数指针的语法通常为:
double(*f)(double)
。除此之外,您正试图通过非成员函数指针传递成员函数。由于您的函数不使用任何成员变量,最简单的解决方案是使其
为静态的

class solution {
  // ...
  static double f(double);
};

如果要使用指向成员函数的指针

改变

double bisect(double, double, double, double f(double), bool&);

在声明和定义中

把电话从

root = s.bisect (s.xLeft, s.xRight, s.epsilon, s.f, s.error);

这就是我所拥有的为我成功编译和链接的东西

 #include <iostream>
 #include <typeinfo>
 #include <math.h>

 using namespace std;

 class solution {

 public:
    double xLeft, xRight;
    double epsilon;
    bool error;

    double bisect(double, double, double, double (solution::*f)(double), bool&);
    double f(double);
 };

 using namespace std;

 double solution::bisect (double xLeft, double xRight, double epsilon, double (solution::*func)(double), bool& error) {
    double xMid;
    double fLeft, fRight;
    double fMid;

    fLeft = (this->*func)(xLeft);
    fRight = (this->*func)(xRight);

    error = (fLeft * fRight) > 0;
    if (error)
       return -999.0;

    while (fabs (xLeft - xRight) > epsilon) {
       xMid = (xLeft + xRight) / 2.0;
       fMid = (this->*func)(xMid);

       if (fMid == 0.0)
          return xMid;
       else if (fLeft * fMid < 0.0)
       {
          xRight = xMid;
          fRight = fMid;
       }
       else
       {
          xLeft = xMid;
          fLeft = fMid;
       }

       cout << "New Interval is [" << xLeft << ", " << xRight << "]" << endl;
    }

 return (xLeft + xRight) / 2.0;
 }

 double solution::f (double x) {
    return ((5 * pow(x,2.0)) + (5 * x) + 3);
 }

 int main(int argc, char * argv[]){
    solution s;
    double root;

    cout << "Enter interval endpoints: ";
    cin >> s.xLeft >> s.xRight;

    cout << "Enter tolerance: ";
    cin >> s.epsilon;

    root = s.bisect (s.xLeft, s.xRight, s.epsilon, &solution::f, s.error);

    if (!(s.error))
       cout << "Root found at " << root << "\nValue of f(x) at root is: " << s.f(root) << endl;
    else
    {
       cout << "The solution of a quadratic equation with coefficients: " << endl;
       // cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
       cout << "has not been found." << endl;
    }
    return 0;
 }
#包括
#包括
#包括
使用名称空间std;
类解决方案{
公众:
双xLeft,xRight;
双ε;
布尔误差;
双二分法(double,double,double,double)(解:*f)(double),bool&);
双f(双);
};
使用名称空间std;
双解::二分法(双xLeft,双xRight,双epsilon,双(解::*func)(双),布尔和错误){
双xMid;
双重打击,恐惧;
双fMid;
fLeft=(本->*函数)(xLeft);
恐惧=(此->*func)(右图);
错误=(弗莱夫特*弗里特)>0;
如果(错误)
return-999.0;
while(fabs(xLeft-xRight)>ε){
xMid=(xLeft+xRight)/2.0;
fMid=(此->*func)(xMid);
如果(fMid==0.0)
返回xMid;
否则如果(fLeft*fMid<0.0)
{
xRight=xMid;
恐惧=fMid;
}
其他的
{
xLeft=xMid;
fLeft=fMid;
}

cout我相信这与回调函数有关。通常,当使用不正确的函数调用时,会出现这种编译器错误。如果需要这种回调函数,可能需要查看函数指针


请向我们显示准确的错误消息。为什么要传递
s.f
?它与
bisect
是同一对象的一部分,
bisect
知道
f
存在并在适当的时间调用
f
。您的代码有点缺少使用类和对象的意义。对象应该将相关数据和函数包装在一起。因为对分是解决方案类的一部分,并且解决方案已经拥有所有数据,那么对分函数不需要函数参数中的数据。这是有意义的。所以我可以说,
double solution::bisect(){
assign4test.cpp:in function'int main(int,char**)“:assign4test.cpp:21:错误:调用“solution::bisect(double&,double&,double&,double(*)(double),bool&)”时没有匹配的函数assign4.h:16:注意:候选函数是:double solution::bisect(double,double,double)(solution:*)(double),bool&)assign4test.cpp:24:error:lvalue required作为一元操作数
抱歉,我忘了添加错误消息。如果将
solution::f
更改为静态成员函数,我的建议将不起作用。我的建议仅在
solution::f
为非静态成员函数时才起作用。我刚刚从d中删除了静态语法eclaration,现在我得到了这个错误。
assign4test.cpp:在函数'int main(int,char**)':assign4test.cpp:24:错误:无法调用成员函数'double solution::f(double)'没有object
@Ryan,我刚刚为我成功编译和链接的答案添加了代码。希望有帮助。看起来包含函数定义的对象文件没有提供给链接器。如果您使用的是
g++
,您可以使用:
g++-o assign4test assign4test.cpp assign4.cpp
。应该d工作。我尝试了这个,但仍然收到错误,说我有一个未定义的引用。
assign4test.cpp:(.text+0xeb):未定义对
solution::f(double)的引用。
solution::bisect(double,double,double(*)(double),bool&)'assign4test.cpp:(.text+0x11b):未定义对
solution::f(双精度)”的引用`
double bisect(double, double, double, double (solution::*f)(double), bool&);
root = s.bisect (s.xLeft, s.xRight, s.epsilon, s.f, s.error);
root = s.bisect (s.xLeft, s.xRight, s.epsilon, &solution::f, s.error);
 #include <iostream>
 #include <typeinfo>
 #include <math.h>

 using namespace std;

 class solution {

 public:
    double xLeft, xRight;
    double epsilon;
    bool error;

    double bisect(double, double, double, double (solution::*f)(double), bool&);
    double f(double);
 };

 using namespace std;

 double solution::bisect (double xLeft, double xRight, double epsilon, double (solution::*func)(double), bool& error) {
    double xMid;
    double fLeft, fRight;
    double fMid;

    fLeft = (this->*func)(xLeft);
    fRight = (this->*func)(xRight);

    error = (fLeft * fRight) > 0;
    if (error)
       return -999.0;

    while (fabs (xLeft - xRight) > epsilon) {
       xMid = (xLeft + xRight) / 2.0;
       fMid = (this->*func)(xMid);

       if (fMid == 0.0)
          return xMid;
       else if (fLeft * fMid < 0.0)
       {
          xRight = xMid;
          fRight = fMid;
       }
       else
       {
          xLeft = xMid;
          fLeft = fMid;
       }

       cout << "New Interval is [" << xLeft << ", " << xRight << "]" << endl;
    }

 return (xLeft + xRight) / 2.0;
 }

 double solution::f (double x) {
    return ((5 * pow(x,2.0)) + (5 * x) + 3);
 }

 int main(int argc, char * argv[]){
    solution s;
    double root;

    cout << "Enter interval endpoints: ";
    cin >> s.xLeft >> s.xRight;

    cout << "Enter tolerance: ";
    cin >> s.epsilon;

    root = s.bisect (s.xLeft, s.xRight, s.epsilon, &solution::f, s.error);

    if (!(s.error))
       cout << "Root found at " << root << "\nValue of f(x) at root is: " << s.f(root) << endl;
    else
    {
       cout << "The solution of a quadratic equation with coefficients: " << endl;
       // cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
       cout << "has not been found." << endl;
    }
    return 0;
 }