Я хочу использовать библиотеку (nlopt), которая имеет функцию set_min_objective, которая берет указатель на числовую функцию myfunc и находит ее минимум. Я хотел бы создать класс, который будет содержать соответственно инициализированную функцию-член. Затем set_min_objective найдет оптимум в конкретном случае (myP в приведенном ниже примере). Последовательность вызовов:
opt.set_min_objective(myfunc, NULL);
и я хотел бы использовать что-то вроде:
opt.set_min_objective(myP.f, NULL);
ошибка, которую я получаю при компиляции это:
main.cpp: In function 'int main()':
main.cpp:79:34: error: no matching function for call to 'nlopt::opt::set_min_objective(<unresolved overloaded function type>, NULL)'
../lib/nlopt.hpp:335:10: note: candidates are: void nlopt::opt::set_min_objective(double (*)(unsigned int, const double*, double*, void*), void*)
../lib/nlopt.hpp:342:10: note: void nlopt::opt::set_min_objective(double (*)(const std::vector<double>&, std::vector<double>&, void*), void*)
../lib/nlopt.hpp:368:10: note: void nlopt::opt::set_min_objective(double (*)(unsigned int, const double*, double*, void*), void*, void* (*)(void*), void* (*)(void*))
Что было бы самым простым решением, чтобы set_min_objective принимала myP.f как нормальный указатель на функцию? Обратите внимание, что myP.f и myfunc имеют одинаковые аргументы и типы возвращаемых значений.
Спасибо,
JD
Вы не можете сделать это напрямую. Вы пытаетесь передать указатель на функцию-член как указатель на функцию. Для этого нужно написать функцию-обертку (обычную функцию), которая, например, делегирует вычисление функции-члену вашего объекта, который является, например, глобальным объектом.
РЕДАКТИРОВАТЬ
На самом деле вам повезло: второй параметр opt.set_min_objective
это указатель на ваши данные, который будет передан функции, на которую вы передаете указатель в качестве первого параметра. Это означает, что ваша функция-обертка не должна использовать глобальный объект.
class YourClass
{
public:
double f(unsigned int i, const double*, double*, void*);
};
double wrapper(unsigned int i, const double* a, double* b, void* o) {
// not sure what you'd need the last param for, but you say you have it...
reinterpet_cast<YourClass*>(o)->f(i, a, b, o);
}
а потом:
YourClass myP;
opt.set_min_objective(wrapper, &myP);
Еще одно редактирование. У кого-то еще была подобная проблема перед вами: http://www.cplusplus.com/forum/general/73166/
Других решений пока нет …