在这种特殊情况下如何从静态成员函数调用非静态成员函数



我想从func()内部调用xupv()方法,但它失败了以下错误:

错误:不能调用成员函数' auto f(double, double)::Local_::xupv(double) '没有对象

#include <iostream>
#include <iomanip>
#include <cmath>
#include <fstream>
#include "QCDNUM/QCDNUM.h"
#include <boost/math/quadrature/trapezoidal.hpp>
#include <vector>
using boost::math::quadrature::trapezoidal;
using namespace std::complex_literals;
using std::cout;
using std::end;
double M = 932.17;
double B = 1.0 / 73.0;
double m_u = 162;
double m_d = 81;
double V = 4.0 / 3.0 * 3.14159 * pow(0.0056, 3);
double R = 0.0056;
auto f(double m, double n){
class Local_
{
public:
int a;
int b;
// All local functions go here:
//
auto xupv( double x )
{
auto z = [&](double E){
auto a_1 = a*b*E
return a_1 
};
auto e = trapezoidal(z, x * M / 2.0, M / 2.0);
auto d = pow(x, 2) * pow(M, 2) / 2.0;
return e * d;
};

static auto func(int *ipdf, double *x)
{
int i = *ipdf;
double xb = *x;
double f = 0;
if (i == 0)
f = 0;
if (i == 1)
f = xupv(xb);
if (i == 2)
f = 0;
if (i == 3)
f = 0;
if (i == 4)
f = 0;
if (i == 5)
f = 0;
if (i == 6)
f = 0;
if (i == 7)
f = 0;
if (i == 8)
f = 0;
if (i == 9)
f = 0;
if (i == 10)
f = 0;
if (i == 11)
f = 0;
if (i == 12)
f = 0;
return f;
};
} local;
local.a = m;
local.b = n;
// -----------------------------------------------------------
int ityp = 1, iord = 3, nfin = 0;                       // unpol, NLO, VFNS
double as0 = 0.364, r20 = 2.0;                          // input alphas
double xmin[] = {1.e-4, 1.e-3, 1.e-2, 1.e-1};           // x-grid
int iwt[] = {1, 1, 1, 1}, ng = 4, nxin = 100, iosp = 3; // x-grid
int nqin = 60;                                          // mu2-grid
double qq[] = {1e0, 15}, wt[] = {1e0, 1e0};             // mu2-grid
double q2c = 3, q2b = 25, q0 = 1;                       // thresholds, mu20
double x = 1, q = 15, qmz2 = 8315.25, pdf[13];
double def[] = // input flavour composition
// tb  bb  cb  sb  ub  db   g   d   u   s   c   b   t
{0., 0., 0., 0., 0., -1., 0., 1., 0., 0., 0., 0., 0., // 1=dval
0., 0., 0., 0., -1., 0., 0., 0., 1., 0., 0., 0., 0., // 2=uval
0., 0., 0., -1., 0., 0., 0., 0., 0., 1., 0., 0., 0., // 3=sval
0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.,  // 4=dbar
0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,  // 5=ubar
0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  // 6=sbar
0., 0., -1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., // 7=cval
0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  // 8=cbar
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  // 9=zero
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  // 10=zero
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  // 11=zero
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}; // 12=zero
int nx, nq, id1, id2, nw, nfout, ierr;
double eps;
int lun = 6;
string outfile = " ";
QCDNUM::qcinit(lun, outfile);                    // initialize
QCDNUM::gxmake(xmin, iwt, ng, nxin, nx, iosp);   // x-grid
QCDNUM::gqmake(qq, wt, 2, nqin, nq);             // mu2-grid
QCDNUM::wtfile(1, "../weights/unpolarised.wgt"); // calculate weights
QCDNUM::setord(iord);                            // LO, NLO, NNLO
QCDNUM::setalf(as0, r20);                        // input alphas
int iqc = QCDNUM::iqfrmq(q2c);                   // charm threshold
int iqb = QCDNUM::iqfrmq(q2b);                   // bottom threshold
QCDNUM::setcbt(nfin, iqc, iqb, 999);             // thresholds in the VFNS
int iq0 = QCDNUM::iqfrmq(q0);                    // start scale
QCDNUM::evolfg(11, local.func, def, iq0, eps);           // evolve all pdf's
QCDNUM::allfxq(1, x, q, pdf, 0, 1);              // interpolate all pdf's
auto res = (pow(2.0 / 3.0, 2)) * (pdf[8] + pdf[4]) + (pow(1.0 / 3, 2)) * (pdf[7] + pdf[5]) + (pow(1 / 3.0, 2)) * (pdf[9] + pdf[3]);
cout << res << endl;
}
int main()
{
f(5, 6);
return 0;
}

我尝试使func()非静态和使用this,但func()不能传递到下面这行:

QCDNUM::evolfg(11, local.func, def, iq0, eps);

静态func()使用非静态xupv()的唯一方法是让func()访问local对象。QCDNUM库不支持将对象作为参数传递,因此您必须使用全局/静态指针,例如:

// move this into global scope...
class Local_
{
public:
...
static Local_ *pThis; // <-- add this
Local_() { pThis = this; }
auto xupv( double x )
{ 
return ...;
}
static auto func(int *ipdf, double *x)
{
...
if (i == 1)
f = pThis->xupv(xb); // <-- use it here
... 
return ...;
} 
}; 
Local_* Local_::pThis = nullptr;
auto f(double m, double n){
Local_ local;
...
QCDNUM::evolfg(..., local.func, ...);
...
}

最新更新