2012-03-16 106 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会违反该承诺。

相关问题