2012-03-16 108 views
-4

我必須在一些庫中工作,無論我做什麼,我都會不斷收到以下錯誤代碼。錯誤將`const`作爲'const`的`this`參數丟棄限定符

傳遞`常量::的Amko問題::發射 '爲' this'argument的 'const的雙::的Amko問題::啓動::比率(雙,雙)' 丟棄限定符

namespace amko { namespace problem { 
launch::launch():base(0.0, 20.0, 1) {} 

base_ptr launch::clone() const 
{ 
return base_ptr(new launch(*this)); 
} 

const double launch::ratio(const double a, const double b) 
{ 
const double area = a*b; 
const double circumference = 2*a+2*b; 
const double ratio = circumference/area; 
return ratio; 
} 

void launch::objfun_impl(fitness_vector &f, const decision_vector &xv) const 
{ 
amko_assert(f.size() == 1 && xv.size() == get_dimension()); 
const double x = xv[0]; 

const double y = launch::ratio(x,5); 

f[0] = y; 
} 

而以下代碼工作得很好。

namespace amko { namespace problem { 

initialValueProblem::initialValueProblem():base(0.0, 20.0, 1) {} 

base_ptr initialValueProblem::clone() const 
{ 
return base_ptr(new initialValueProblem(*this)); 
} 

Eigen::VectorXd initialValueProblem::computeDerivative(const double time, const Eigen::VectorXd& state) 
{ 
Eigen::VectorXd stateDerivative(1); 
stateDerivative(0) = state(0) - std::pow(time, 2.0) + 1.0; 
return stateDerivative; 
} 

void initialValueProblem::objfun_impl(fitness_vector &f, const decision_vector &xv) const 
{ 
amko_assert(f.size() == 1 && xv.size() == get_dimension()); 
const double x = xv[0]; 

double intervalStart = 0.0; 
double intervalEnd = 10.0; 
double stepSize = 0.1; 

Eigen::VectorXd initialState_; 
initialState_.setZero(1); 
initialState_(0) = x; 

numerical_integrators::EulerIntegratorXd integrator(boost::bind(&initialValueProblem::computeDerivative, 
                    const_cast<initialValueProblem*>(this), _1, _2), intervalStart, initialState_); 
Eigen::VectorXd finalState = integrator.integrateTo(intervalEnd, stepSize); 
f[0] = fabs(finalState(0) - 11009.9937484598); 
} 

謝謝!

+3

請將您的代碼減少到**最小**測試用例。 – 2012-03-16 17:59:11

+1

這種「常見問題」問題每天發佈**。來吧! – mfontanini 2012-03-16 18:14:23

+0

@fontanini:隨意留下一個舊的問題的鏈接,我們將把它作爲一個副本來關閉。 – 2012-03-16 18:17:29

回答

2

launch::objfun_implconst成員函數,它不能更改成員或調用其他函數。這意味着它不能撥打非conststatic成員函數,如launch::ratio

因爲launch::ratio不會出現在所有訪問成員,只是它的參數,最簡單的解決方法是通過改變類定義的雛形,使之成爲static成員函數:

static /* <- ADDED static HERE */ double launch::ratio(const double a, const double b); 
+0

是的!非常感謝。不是說我真的知道如何聲明它「const double launch :: ratio」使它成爲一個非const成員函數,而將其稱爲「static double launch :: ratio」確實使它成爲一個靜態成員函數。 – user1274616 2012-03-16 18:13:59

+3

@ user1274616:要使其成爲一個const成員函數,可以在參數列表後加上'const'。就像你用'objfun_impl'所做的那樣。 – 2012-03-16 18:16:40

0

的問題是您的ratio成員函數不是const,即使您沒有修改對象的任何成員(爲什麼它是成員函數?)。在objfun_impl內部,您致電ratio。現在,objfun_implconst,因此承諾不修改對象,但調用ratio會違反該承諾。

相關問題