У меня проблема с использованием очень сложной функции C в классе C ++ (перезапись функции C - это , а не опция).Функция C:
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);
Мне нужно предоставить функцию void типа integrand
, и adapt_integrate вычислит n-мерный интеграл.Код в calcTripleIntegral
(ниже) работает как отдельная функция, если func
- отдельная функция).Я хочу передать (нестатическую!) Функцию-член класса в качестве подынтегрального выражения, поскольку это может быть легко перегружено и т. Д. *
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);
}
}
В GCC 4.4.5 (предварительная версия) это дает мне:
ошибка: переменная 'std :: tr1 :: function func' имеет инициализатор, но неполный тип
РЕДАКТИРОВАТЬ : В чем ошибка в моемкод?Теперь я попытался скомпилировать с GCC 4.4, 4.5 и 4.6, все это привело к той же ошибке.Либо ничего не было сделано по этому вопросу, либо я сделал что-то не так / EDIT
Спасибо очень большое!Если я не совсем ясен, я с удовольствием уточню.
PS: Могу ли я обойти это без tr1, используя указатель на функцию, определенную где-то в myIntegrator.cpp?
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ : хорошо, я ошибался, думая, что TR1 предоставил решение для одной или двух строк.Облом.Я "конвертирую" свои классы в пространства имен и копирую объявления функций.Мне нужен только один базовый класс и один подкласс, который переопределил интерфейс.Указатель на функцию C + класс C ++ = плохие новости для меня.В любом случае, спасибо за ответы, вы показали мне несколько темных углов C ++;)