2012-03-16 3 views
-4

Мне нужно работать в некоторых библиотеках, и независимо от того, что я делаю, я продолжаю получать следующую ошибку с этим кодом.Ошибка Передача `const` как` this` аргумент `const double` отбрасывает квалификаторы

прохождение `константный AMKO :: проблемы :: запуск 'как' this'argument из 'сопз двойной 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

Пожалуйста, уменьшите свой код до ** минимального ** тестового чехла. –

+1

Этот вопрос «проблема с константой» размещается ** каждый день **. Давай! – mfontanini

+0

@fontanini: Не стесняйтесь оставлять ссылку на один из старых вопросов, и мы закроем это как дубликат. –

ответ

2

launch::objfun_impl - это функция-член const, она не может изменять членов или вызывать другие функции. Это означает, что он не может вызывать функции const не static, такие как launch::ratio.

Поскольку launch::ratio не появляется для доступа пользователей на всех, только его аргументы, самое простое исправление, чтобы сделать его функцию в static члена путем изменения прототипа внутри определения класса:

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

Да, это работает! Спасибо. Не то, чтобы я действительно понял, как объявить его «const double launch :: ratio» делает его неконстантной функцией-членом, но при вызове «static double launch :: ratio» делает его статической функцией-членом. – user1274616

+3

@ user1274616: Чтобы сделать его константной функцией, вы поместите 'const' ПОСЛЕ списка параметров. Как вы делали с 'objfun_impl'. –

0

Проблема в том что ваша функция ratio не является const, даже если вы не изменяете ни одного члена объекта (почему это вообще функция-член?). Внутри objfun_impl вы звоните ratio. Теперь objfun_impl - const, и поэтому обещает не изменять объект, но вызов ratio нарушит это обещание.

Смежные вопросы

 Смежные вопросы