我想从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, ...);
...
}