2012-03-16 3 views
-4

일부 라이브러리 내에서 작업해야하는데이 코드에서 다음 오류가 계속 발생합니다. `의 this'argument '로'const를 amko :: 문제 :: 출시 통과Error 'const`를`const double`의`this` 인수로 전달하면 한정자가 없어집니다.

'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

코드를 ** 최소 ** 테스트 케이스로 줄이십시오. –

+1

이런 종류의 "const 문제"질문은 매일 ** 게시됩니다 **. 어서! – mfontanini

+0

@fontanini : 오래된 질문 중 하나에 대한 링크를 남겨두면 중복으로 닫습니다. –

답변

2

launch::objfun_impl은 구성원 기능으로 구성원을 변경하거나 다른 기능을 호출 할 수 없습니다. 즉, 과 같은 비회원 전화가 아닌 conststatic 멤버 함수를 호출 할 수 없습니다.

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

예이 작동합니다! 정말 고마워. 실제로 "const double launch :: ratio"선언은 비 const 멤버 함수로, "정적 double launch :: ratio"를 호출하면 정적 멤버 함수가됩니다. – user1274616

+3

@ user1274616 : const 멤버 함수로 만들기 위해, 매개 변수 목록 뒤에'const'를 넣으십시오. 'objfun_impl'에서했던 것처럼. –

0

문제는 다음과 같습니다

launch::ratio 때문에, 전혀 단지 인수를 멤버에 액세스 할 수 나타나지 않습니다, 간단한 수정 클래스 정의 내부의 프로토 타입을 변경하여 그것을 static 멤버 함수를 만드는 것입니다 사용자의 ratio 멤버 함수가 const이 아닌 경우에도 개체의 멤버를 수정하지 않아도됩니다 (이 멤버 함수는 전혀 이유가 무엇입니까?). 으로 전화 하시려면 objfun_impl 안에 있습니다. 자, objfun_implconst이고 따라서 객체를 수정하지 않겠다고 약속하지만 ratio을 호출하면이 약속이 깨질 수 있습니다.