2011-11-28 182 views
1

我以前遇到過this的問題,但現在它可以以某種方式工作。使用boost :: bind將成員函數綁定到boost :: bisect?

現在我遇到了以下問題。在我用相同的函數調用boost :: bisect之前,我需要將值綁定到成員函數中。我發現相當不錯tutorial,我已經跟着它,但似乎我仍然做錯了什麼。

起初,我創建測試類在那裏我得到了以下工作:

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: :二等分,要麼沒有找到根,要麼在間隔中有多個根(f(min)= -0.0032916729090909091)。

無論如何,這裏是類::函數,因爲某些原因,它不作爲綁定成員函數工作。我測試了它作爲非成員和它的作品

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); 
} 

回答

1

如果我讀正確的教程,它應該是:

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

即該參數boost::bind()是:

  1. 功能(對象)的名稱綁定到
  2. 參數傳遞給,作爲功能希望他們

對於你的情況,一個CLASS::memberFunc(),這將是一個CLASS *(可能,但任何CLASS *都可以)作爲第一個,你在字面上聲明如此,隨後參數稍後傳遞到綁定對象

這些「期貨」由_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; 
[ ... ] 
1

此代碼:

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

是正確的。您收到的錯誤意味着CLASS :: Function返回的內容無效。 bisect在給定的區間[0; 0]抱怨多根(或可能沒有根)。 1]。​​怎麼樣?

+0

你可以在CLASS :: Function中設置一個斷點,看它是否得到正確的輸入數字嗎? –

+0

請發佈您的真實CLASS :: Function。你在上面發佈的一個有未配對的括號,空白(...)點並使用未定義的變量var3。真的很難猜出什麼是錯的。您可以編輯您的答案,以便代碼格式良好。 –

+0

增加了功能碼。所以這個函數得到了正確的值,它會按照它的計算來計算總數,但不知何故它仍然表示它找不到最大值或者找到了多個根。那麼綁定的問題呢?我希望我不需要在正常分區內綁定物品? – Mare