매우 C 함수 (C 함수를 다시 작성하는 것은 이 아니고이 아닌 옵션)에서 복잡한 C 함수를 사용하는 데 문제가 있습니다. C 함수 :std :: tr1 :: function 및 std :: tr1 :: bind
typedef void (*integrand) (unsigned ndim, const double* x, void* fdata,
unsigned fdim, double* fval);
// This one:
int adapt_integrate(unsigned fdim, integrand f, void* fdata,
unsigned dim, const double* xmin, const double* xmax,
unsigned maxEval, double reqAbsError, double reqRelError,
double* val, double* err);
I는 자신의 입력 integrand
공극 기능을 제공해야하고, adapt_integrate는 N 차원의 적분을 계산한다. 코드 calcTripleIntegral
(아래)은 func
이 독립 실행 형 함수 인 경우 독립 실행 형 함수로 작동합니다. 이 쉽게 등 과부하 될 수 나는 GCC 4.4.5 (시험판)에
class myIntegrator
{
public:
double calcTripleIntegral(double x, double Q2, std::tr1::function<integrand> &func) const
{
//...declare val, err, xMin, xMax and input(x,Q2) ...//
adapt_integrate(1, func, input,
3, xMin, xMax,
0, 0, 1e-4,
&val, &err);
return val;
}
double integrandF2(unsigned ndim, const double *x, void *, // no matter what's inside
unsigned fdim, double *fval) const; // this qualifies as an integrand if it were not a class member
double getValue(double x, double Q2) const
{
std::tr1::function<integrand> func(std::tr1::bind(&myIntegrator::integrandF2, *this);
return calcTripleIntegral(x,Q2,func);
}
}
, 이것은 저를 제공합니다 ..., 적분과 같은 (! 비 정적) 클래스 멤버 함수를 전달하려는 :
error: variable 'std::tr1::function func' has initializer but incomplete type
편집 : 내 코드의 오류는 무엇인가요? 나는 GCC 4.4, 4.5 및 4.6으로 컴파일을 시도했다. 모두 동일한 오류가 발생했다. 하나 더 작업이 이루어되지 않은, 또는 나는 매우 많은
감사에게 를 뭔가 잘못 /편집했다! 내가 충분히 명확하지 않으면, 기꺼이 자세히 설명해 드리겠습니다.
추 신 : myIntegrator.cpp 어딘가에 정의 된 함수 포인터를 사용하여 tr1 요소없이이 문제를 해결할 수 있습니까?
최종 업데이트 : 오케이, 나는 TR1이이를 위해 한 두 줄짜리 해결책을 제공했다고 착각했습니다. 파머. 클래스를 네임 스페이스로 "변환"하고 함수 선언을 복사합니다. 하나의 기본 클래스와 인터페이스를 다시 구현 한 하나의 하위 클래스 만 있으면됩니다. C 함수 포인터 + C++ 클래스 = 나에게 나쁜 소식. ! 어쨌든 모든 해답을, 당신이 나에게 C++의 일부 어두운 구석을 표시했습니다 감사합니다, 나는 적분으로 (비 정적) 클래스 멤버 함수를 전달하려는
C++ 0x 기능이 허용됩니까? –
'fdata'와'input' 매개 변수는 무엇입니까? 왜 피한화 유형의'void *'매개 변수에 이름이 없습니까? –
Caspin, 형식 선언에서 함수의 매개 변수 이름을 지정할 필요가 없습니다. 함수에서 함수를 사용할 필요가 없다면 함수의 실제 정의에서 이름을 지정할 필요조차 없습니다. 함수는 다른 코드와 함께 사용하기 위해 특정 서명과 일치해야하는 경우 일반적으로이 코드를 작성하지만 일부 매개 변수는 구현시 사용되지 않습니다. –