2012-03-16 17 views
-4

私はいくつかのライブラリ内で作業しなければなりません。エラー `const`を` const double`の `const double`引数として渡すと修飾子が破棄されます

のthis'argument 'として `CONST amkoを通過::問題を::打ち上げ '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

コードを** minimal **テストケースに減らしてください。 –

+1

この種の「const問題」の質問は毎日**掲載されています。いい加減にして! – mfontanini

+0

@fontanini:古い質問の1つにリンクを残してください。これを複製として閉じます。 –

答えて

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

+3

@ user1274616:constメンバー関数にするには、パラメータリストの後に 'const'を入れます。あなたが 'objfun_impl'でしたように。 –

0

問題がありますオブジェクトのメンバを変更していなくても、ratioメンバ関数はconstではありません(なぜメンバ関数なのですか?)。 objfun_implの中にratioと呼んでいます。今、objfun_implconstであり、したがってオブジェクトを変更しないことを約束しますが、ratioを呼び出すとその約束が破られます。

関連する問題