首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++错误:没有调用‘simplex615<arbitraryFunc>::amoeba’的匹配函数

C++错误:没有调用‘simplex615<arbitraryFunc>::amoeba’的匹配函数
EN

Stack Overflow用户
提问于 2019-01-25 09:59:19
回答 1查看 54关注 0票数 2

我正在尝试实现一些C++代码,以便使用单纯形算法找到函数的最大值。不幸的是,我在C++方面没有任何经验。我遇到了这个错误,似乎无法从类似问题的答案中找到解决办法。

simplex.cpp:在函数‘int(int,char**)’中: simplex.cpp:22:25: error:调用simplex615 615::amoeba(仲裁函数&,double)没有匹配函数 simplex.amoeba(foo,1e-7);

还有与链接文件"simplex615.h“相关的警告

在simplex.cpp:4:0中包含的文件中: simplex615.h:302:6:注意:候选人:voidsimplex615::amoeba(optFunc&,double),F= arbitraryFunc simplex615::阿米巴(optFunc& foo,double tol) { simplex615.h:302:6:注意:参数1从‘arbitraryFunc’到‘optFunc&没有已知的转换

simplex.cpp

代码语言:javascript
复制
#include <vector>
#include <cmath>
#include <iostream>
#include "simplex615.h"
#define ZEPS 1e-10

// function object used as an argument
class arbitraryFunc {
    public:
    double operator() (std::vector<double>& x) {
        // f(x0,x1) = 100*(x1-x0^2)^2 + (1-x0)^2
        return 100*(x[1]-x[0]*x[0])*(x[1]-x[0]*x[0])+(1-x[0])*(1-x[0]);
    }
};

int main(int main, char** argv) {
    double point[2] = {-1.2, 1};
    arbitraryFunc foo;
    // initial point to start
    // WILL BE DISCUSSED LATER
    simplex615 <arbitraryFunc> simplex(point, 2); // create a simplex
    simplex.amoeba(foo, 1e-7);  // optimize for a function
    // print outputs
    std::cout << "Minimum = " << simplex.ymin() << ", at ("
    << simplex.xmin()[0] << ", " << simplex.xmin()[1]
    << ")" << std::endl;
    return 0;
}

simplex615.h

代码语言:javascript
复制
template <class F> // F is a function object
void simplex615 <F>::amoeba(optFunc& foo, double tol) {
  evaluateFunction(foo);
  while(true) {
    evaluateExtremes();
    prepareUpdate();

    if ( check_tol(Y[idxHi],Y[idxLo],tol) ) break;

    updateSimplex(foo, -1.0); // reflection

    if ( Y[idxHi] < Y[idxLo] ) {
      updateSimplex(foo, -2.0); // expansion
    }
    else if ( Y[idxHi] >= Y[idxNextHi] ) {
      if ( !updateSimplex(foo, 0.5) ) {
    contractSimplex(foo);
      }
    }
  }
}

simplex615.h

代码语言:javascript
复制
class optFunc {
   public:
      virtual double operator() (std::vector<double>& x) = 0;
};

链接到完整文件simplex.cpp和simplex.h:源代码

任何帮助都将不胜感激。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-25 10:43:48

在我看来,在您的simplex615.h中,您忘记了在amoeba方法中使用‘类F’。只需将optFunc替换为F,它就可以解决这个问题。

代码语言:javascript
复制
template <class F> // F is a function object
void simplex615 <F>::amoeba(F& foo, double tol) {
...
}

C++中的模板类参数定义了一个通用类型,在使用该模板时可以替换该类型。

同样从这个例子中,您可以从头文件中删除optFunc的声明。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54362898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档