-4

私はいくつかのライブラリ内で作業する必要があり、何をしても、このコードで次のエラーが発生し続けます。

「const amko::problem::launch」を「const double amko::problem::launch::ratio(double, double)」の「this」引数として渡すと、修飾子が破棄されます

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

ありがとうございました!

4

2 に答える 2

2

launch::objfun_implconstメンバー関数であり、メンバーを変更したり、他の関数を呼び出したりすることはできません。つまり、などのconststaticメンバー関数を呼び出すことはできませんlaunch::ratio

launch::ratioメンバーにアクセスするようには見えないので、その引数だけです。最も簡単な修正はstatic、クラス定義内のプロトタイプを変更して、メンバー関数にすることです。

static /* <- ADDED static HERE */ double launch::ratio(const double a, const double b);
于 2012-03-16T18:00:35.163 に答える
0

問題は、オブジェクトのメンバーを変更していなくても、ratioメンバー関数が ではないconstことです (なぜメンバー関数なのですか?)。内部objfun_implであなたが呼んでratioいます。現在、objfun_implisconstであるため、オブジェクトを変更しないことを約束していますが、呼び出すratioとその約束が破られます。

于 2012-03-16T18:04:10.410 に答える