C++ 将`const`作为`const double`的`this`参数传递时出错,将丢弃限定符

C++ 将`const`作为`const double`的`this`参数传递时出错,将丢弃限定符,c++,constants,qualifiers,C++,Constants,Qualifiers,我必须在一些库中工作,无论我做什么,我都会在代码中遇到以下错误 将“const-double-amko::problem::launch::ratio(double,double)”的“this”参数传递为“const-double-amko::problem::launch::ratio(double,double)”将丢弃限定符 namespace amko { namespace problem { launch::launch():base( 0.0, 20.0, 1 ) {} bas

我必须在一些库中工作,无论我做什么,我都会在代码中遇到以下错误

将“const-double-amko::problem::launch::ratio(double,double)”的“this”参数传递为“const-double-amko::problem::launch::ratio(double,double)”将丢弃限定符

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 );
}
名称空间amko{名称空间问题{
initialValueProblem::initialValueProblem():base(0.0,20.0,1){}
base_ptr initialValueProblem::clone()常量
{
返回基本参数(新的初始值问题(*此));
}
特征::VectorXd initialValueProblem::computeDerivative(常数加倍时间,常数特征::VectorXd&state)
{
本征::矢量xd状态导数(1);
状态导数(0)=状态(0)-std::pow(时间,2.0)+1.0;
收益率衍生工具;
}
void initialValueProblem::objfun\u impl(适应度向量&f,常数决策向量&xv)常数
{
amko_assert(f.size()==1和&xv.size()==get_dimension());
常数双x=xv[0];
双间隔开始=0.0;
双区间=10.0;
双步长=0.1;
本征::矢量xd初始状态;
初始状态设置为零(1);
初始状态_u0)=x;
数值积分器::欧拉积分器XD积分器(boost::bind(&initialValueProblem::computeDerivative,
const_cast(this),_1,_2),intervalStart,initialState;
特征::VectorXd finalState=积分器.integrateTo(intervalEnd,步长);
f[0]=fabs(最终状态(0)-11009.9937484598);
}

谢谢!

launch::objfun\u impl
是一个
const
成员函数,它不能更改成员或调用其他函数。这意味着它不能调用非
const
静态
成员函数,如
launch::ratio

由于
launch::ratio
似乎根本不访问成员,只访问其参数,因此最简单的修复方法是通过更改类定义内的原型将其变为
静态
成员函数:

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

static/*问题在于,您的
ratio
成员函数不是
const
,即使您没有修改对象的任何成员(为什么它是成员函数?).在
objfun\u impl
内部,您正在调用
ratio
。现在,
objfun\u impl
const
,因此承诺不会修改对象,但调用
ratio
将打破这一承诺。

请将您的代码减少到最小的测试用例。这种“const问题”问题每天都在发布。来吧!@fontanini:请随意留下一个链接到一个旧问题,我们将以副本的形式关闭此问题。是的,此问题的可能副本有效!非常感谢。我并不真正了解声明它为“const double launch::ratio”如何使其成为非const成员函数,同时将其称为“static double launch::ratio”是否将其设置为静态成员函数。@user1274616:若要将其设置为常量成员函数,请将
const
放在参数列表后。就像使用
objfun\u impl
一样。