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 >' のインスタンスをスローした後に終了が呼び出されました: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), 0.0, 1.000000, TerminationCondition());

正しい。表示されるエラーは、CLASS::Function が返すものが無効であることを意味します。bisect指定された間隔で複数のルート (またはおそらくルートがない) について不平を言っています [0; 1]。どのようにCLASS::Function見えますか?

于 2011-11-28T21:41:03.653 に答える
1

チュートリアルを正しく読むと、次のようになります。

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

つまり、パラメータは次のboost::bind()とおりです。

  1. バインドする関数 (オブジェクト) の名前
  2. 関数が期待するように、それに渡す引数

あなたの場合、 a CLASS::memberFunc()、それは最初にCLASS *(おそらくthisしかし何でもCLASS *OKです)、文字通りそのように述べ、その後にバインドされた 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 に答える