【问题标题】:Error Passing `const` as `this` argument of `const double` discards qualifiers错误传递 `const` 作为 `const double` 的 `this` 参数丢弃限定符
【发布时间】:2012-03-16 17:58:04
【问题描述】:

我必须在一些库中工作,无论我做什么,这段代码都会出现以下错误。

将 `const amko::problem::launch' 作为 'this'argument of '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 );
}

谢谢!

【问题讨论】:

标签: c++ constants qualifiers


【解决方案1】:

launch::objfun_impl 是一个const 成员函数,它不能改变成员或调用其他函数。这意味着它不能调用非conststatic成员函数,例如launch::ratio

因为launch::ratio 似乎根本不访问成员,只是访问它的参数,所以最简单的解决方法是通过更改类定义中的原型使其成为static 成员函数:

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

【讨论】:

  • 是的,这行得通!非常感谢。并不是说我真的明白如何将其声明为“const double launch::ratio”使其成为非常量成员函数,而将其称为“static double launch::ratio”确实使其成为静态成员函数。
  • @user1274616:要使其成为 const 成员函数,请将 const 放在参数列表之后。就像你对 objfun_impl 所做的那样。
【解决方案2】:

问题是您的ratio 成员函数不是const,即使您没有修改对象的任何成员(为什么它根本是成员函数?)。在objfun_impl 内部,您正在调用ratio。现在,objfun_implconst,因此承诺不会修改对象,但调用 ratio 会破坏该承诺。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多