Вызов функции с аргументом указателя на функцию шаблона - PullRequest
0 голосов
/ 28 сентября 2018

Я не привык к шаблонам C ++, и у меня возникла проблема с использованием библиотек, созданных с помощью шаблонов.

Это математические библиотеки, включенные в Численные методы в C 3-м издании, и у меня возникла проблемас использованием методов.

Ниже приведена функция, которую я пытаюсь использовать:

// roots.h
//...
template <class T>
// Doub is a defined type that is equal to double
Doub rtbis(T &func, const Doub x1, const Doub x2, const Doub xacc) {
    const Int JMAX=50;
    Doub dx,xmid,rtb;
    Doub f=func(x1);
    Doub fmid=func(x2);
    if (f*fmid >= 0.0) throw("Root must be bracketed for bisection in rtbis");
    rtb = f < 0.0 ? (dx=x2-x1,x1) : (dx=x1-x2,x2);
    for (Int j=0;j<JMAX;j++) {
        fmid=func(xmid=rtb+(dx *= 0.5));
        if (fmid <= 0.0) rtb=xmid;
        if (abs(dx) < xacc || fmid == 0.0) return rtb;
    }
    throw("Too many bisections in rtbis");
}
//...

И с этим в main.cpp я попытался вызвать

// main.cpp
#include "nr3.h"
#include "roots.h"
#include "bessel.h"

int main() {
    Doub (Bessjy::*fptr) (Doub) = &Bessjy::j0;
    Doub root = 0;

    root = rtbis<double (Bessjy::*)(double)>(fptr,1.0,10.0,0.000001);

    std::cout << root << std::endl;
}

Я использовал g ++ для компиляции, и сообщение об ошибке гласило:

error: called object type 'double (Bessjy::*)(double)' is not a function or function pointer
Doub f=func(x1);
note: in instantiation of function template specialization
'rtbis&lt;double (Bessjy::*)(double)&gt;' requested here
root = rtbis&lt;double (Bessjy::*)(double)'&gt;(fptr,1.0,10.0,0.000001);

Я изменил код, как сказал мне компилятор, но все равно он повторяет то же сообщение об ошибке.

Я не понимаю, как это решить.Конечно, я упускаю важный синтаксис.

1 Ответ

0 голосов
/ 28 сентября 2018

(Публикация этого для завершения, основанная на обсуждении в комментариях, для других, чтобы найти, если у них есть подобные вопросы).

Поскольку Bessjy::j0() является статической функцией-членом, как упоминалось в комментариях под вопросом, ее тип такой же, как если бы она была обычной функцией .Вы можете передать его в качестве аргумента rtbis<>(), как и любую другую обычную функцию.Вот пример:

#include <iostream>

using Int = int ;
using Doub = double ;

class Bessjy
{
public:
    static Doub j0(Doub x1) { return x1*x1 + 60.0 ; }     
} ;

template <class T>
Doub rtbis(const T& func, const Doub x1, const Doub x2, const Doub xacc) { 
    return func(x1) ;
}

int main() 
{
    const auto root = rtbis(Bessjy::j0,1.0,10.0,0.000001);
    std::cout << root << std::endl;
    return 0 ;
}

Попробуйте онлайн здесь .Прочитайте это для получения дополнительной информации и предостережений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...