在此范围内未声明使用dlib的成员函数指针

时间:2018-07-11 21:41:40

标签: c++ optimization dlib member-function-pointers

我正在搜索以使用dlib库优化近似误差... 因此,假设我有Point(x,y)和一个值向量,用于查找最小值并在本地拟合误差,因此我实现了此类:

#include <iostream>
#include <vector>
#include <cmath>
#include <dlib/optimization.h>
class Point
{
   int _x, _y;
public:
    Point(int x, int y): _x(x), _y(y){}

    double findError(const double& psi)
    {
        auto err = std::erf(_x - psi) - std::erf(_y-psi);
        return std::pow(err,2);
    }
    double optimize(const Point& p, dlib::matrix<double,0,1> &psiValues)
    {
         auto err = p->*findError ;
         dlib::find_min_box_constrained(bfgs_search_strategy(),  
                             objective_delta_stop_strategy(1e-9),  
                             findError, derivative(findError), psiValues, {0.1,0.5,0.9},{0.1,0.4,0.8 });
        return psiValues(0);
    }
};

并且此代码无法编译,因此我尝试在这样的静态类中提取优化器:

#include <iostream>
#include <vector>
#include <cmath>
//#include <dlib/optimization.h>
class Point
{
   int _x, _y;
public:
   Point(int x, int y): _x(x), _y(y){}

    double findError(const double& psi)
   {
       auto err = std::erf(_x - psi) - std::erf(_y-psi);
       return std::pow(err,2);
   }
};

class Errorcalculator
{
public:

    static double optimize(const Point& p, std::vector<double> &psiValues)
    {
        auto err = p->*findError ;
        // dlib::find_min_box_constrained(bfgs_search_strategy(),  
        //                     objective_delta_stop_strategy(1e-9),  
        //                     p->*findError, derivative(p->*findError), psiValue, {0.1,0.9 },{0.1 0.8});
        return 0.0;
    }
 };

现在我正在获取(使用带有或不带有静态关键字的dlib函数的相同编译错误)

  

错误:在此范围内未声明“ findError”

如果将点p声明为参数怎么办?如何使用包装在类中的dlib函数?

2 个答案:

答案 0 :(得分:0)

findError是成员方法,但不是指针。 要创建指向方法的指针,请使用以下语法: 返回值类名 :: * * 指针名)(方法参数); 样本:

class widget
{
public:
    unsigned char foo(long long, double) {}
};
int main()
{
    // declaration of pointer
    unsigned char (widget::*ptr_to_method)(long long, double);
    // setting the pointer on certain method in class (not object!)
    ptr_to_method = &widget::foo;
    // we have some object of widget class
    widget obj{};
    // using the pointer
    unsigned char res = (obj.*ptr_to_method)(10L, 10.0); // arguments
    // if we have obj as widget*, we'll use ->* syntax to call method
}

在此示例中,我们使用了本地指针,也许您将使用全局指针。 阅读更多信息,例如here

答案 1 :(得分:0)

基于acade的答案,解决了编译问题。但是我在这里添加我的解决方案作为解决Dlib库使用的答案

 #include <iostream>
 #include <vector>
 #include <cmath>
 #include <dlib/optimization.h>
 class Point
 {
    int _x, _y;
 public:
    Point(int x, int y): _x(x), _y(y){}

    double findError(const double& psi)
    {
        auto err = std::erf(_x - psi) - std::erf(_y-psi);
        return std::pow(err,2);
    }
    double optimize(double &psiValue, dlib::matrix<double,0,1>& lowerValues, dlib::matrix<double,0,1>& upperValues)
    {
        auto lambdaError = [this](const double& param) -> double
         { return this->findError(param);};

        auto lambdaDerivativeError = [this](const double& param) -> double 
         {return dlib::derivative(lambdaError)(param);};

        dlib::find_min_box_constrained(bfgs_search_strategy(),  
                         objective_delta_stop_strategy(1e-9),
                         lambdaError, lambdaDerivativeError, 
                         psiValue, lowerValues, upperValues);
        return psiValue;
    }


 };

想法是使用封装了成员函数的参数化Lambda函数

相关问题