1

我以前遇到过这个问题,但现在它以某种方式工作。

现在我有以下问题。在使用相同的函数调用 boost::bisect 之前,我需要将值绑定到成员函数中。我找到了很好的教程,并且我已经按照它进行操作,但似乎我仍然做错了什么。

起初,我创建了测试类,并在其中进行了以下工作:

std::pair<double, double> result = bisect(&Func, 0.0, 1.0, TerminationCondition());
            double root = (result.first + result.second) / 2;

之后,我“即时添加绑定,因为我认为它可以工作”

 std::pair<double, double> result = bisect(boost::bind(&CLASS::Function,this, _1), 0.0, 1.000000, TerminationCondition());

结果是一个错误。错误:在抛出 'boost::exception_detail::clone_impl >' 的实例后调用终止 what():函数 boost::math::tools::bisect 中的错误:boost::math::tools 中的符号没有变化: :bisect,要么找不到根,要么区间中有多个根(f(min) = -0.0032916729090909091)。

无论如何,这里的 class::function 由于某种原因不能作为具有绑定的成员函数工作。我以非会员身份对其进行了测试,并且可以正常工作

double CLASS::Function(double c)
{
/* values: m_a, m_b, m_c, m_d, and m_minus are located in .h file */

normal norm;
double temp = m_d*sqrt(c);

double total = ((1-boost::math::pdf(norm,(m_a*c+m_b)/temp))-(1 - m_c)+boost::math::pdf(norm,(m_a*c+m_b)/temp));

return (total - m_minus); 
}
4

2 回答 2

1

如果我正确阅读了教程,它应该是:

std::pair<double, double> result =
    bisect(boost::bind(&CLASS::Function, this, _1, _2, _3),
        0.0, 1.000000, TerminationCondition());

即参数为boost::bind()

  1. 要绑定的函数(对象)的名称
  2. 传递给它的参数,正如函数所期望的那样

对于您的情况, aCLASS::memberFunc()将是 a CLASS *(可能this但任何CLASS *都可以)作为第一个,您按字面意思如此声明,然后是稍后传递给绑定 object 的参数

这些“期货”由 等指定_1_2具体取决于它们在调用时的位置。

例子:

class addthree {
private:
    int second;
public:
    addthree(int term2nd = 0) : second(term2nd) {}
    void addto(int &term1st, const int constval) {
        term1st += (term2nd + constval);
    }
}

int a;
addthree aa;
boost::function<void(int)> add_to_a = boost::bind(&addthree::addto, &aa, a, _1);
boost::function<void(void)> inc_a = boost::bind(&addthree::addto, &aa, a, 1);

a = 0 ; add_to_a(2); std::cout << a << std::endl;
a = 10; add_to_a(a); std::cout << a << std::endl;
a = 0 ; inc_a(); std::cout << a << std::endl;
[ ... ]
于 2011-11-28T17:56:14.123 回答
1

这段代码:

std::pair<double, double> result = bisect(boost::bind(&CLASS::Function,this, _1), 0.0, 1.000000, TerminationCondition());

是正确的。您收到的错误意味着 CLASS::Function 返回的内容无效。bisect正在抱怨给定区间 [0; 中的多个根(或可能没有根);1]。看起来怎么CLASS::Function样?

于 2011-11-28T21:41:03.653 回答