C ++:绑定成员函数的地址

时间:2011-11-22 10:57:50

标签: c++ function

我有以下成员函数:

void GClass::InitFunctions()
{ // Initialize arrays of pointers to functions.

ComputeIntLen[0] = &ComputeILS;
ComputeIntLen[1] = &ComputeILE;
ComputeIntLen[2] = &ComputeILI;
PostStep[0] = &PSS;
PostStep[1] = &PSE;
PostStep[2] = Ψ
gRotation = new Rotation();
}

GClass显然包含所有相关成员 - :

    void ComputeILE(Int_t, Int_t *, Double_t *);
    void ComputeILI(Int_t, Int_t *, Double_t *);
    void PSS(Int_t , Int_t *, Int_t &, Int_t*);
    void PSE(Int_t, Int_t *, Int_t &, Int_t*);
    void PSI(Int_t , Int_t *, Int_t &, Int_t*);
    ComputeIntLenFunc ComputeIntLen[gNproc];
    PostStepFunc      PostStep[gNproc];
... //other members
}

其中gNproc是一个全局const int,而ComputeIntLenFunc和PostStepFunc是这样的typedef:

typedef void (*ComputeIntLenFunc)(Int_t ntracks, Int_t *trackin, Double_t *lengths);
typedef void (*PostStepFunc)(Int_t ntracks, Int_t *trackin, Int_t &nout, Int_t* trackout);

当我编译它时,我得到gcc给出一个错误:“ISO C ++禁止使用非限定或带括号的非静态成员函数的地址来形成指向成员函数的指针。说'&amp; GClass :: ComputeIntLenScattering'”< / p>

当我在InitFunctions()中用GClass :: FunctionNames替换FunctionNames时,我得到了     “无法在赋值中将'void(GClass :: *)(Int_t,Int_t *,Double_t *)'转换为'void(*)(Int_t,Int_t *,Double_t *)'

请帮帮我。 C ++的主题是什么?

2 个答案:

答案 0 :(得分:1)

非静态成员函数指针与自由函数指针不同。您使用的基本上是自由函数指针类型,由于&GClass::ComputeILS的类型与ComputeIntLenFunc不兼容,因此不起作用。

使用此:

typedef void (GClass::*ComputeIntLenFunc)(Int_t, Int_t *, Double_t *);
typedef void (GClass::*PostStepFunc)(Int_t, Int_t *, Int_t &, Int_t*);

我省略了参数名称,因为在typedef中不需要它们。

此外,当您获得成员函数的地址时,您将使用GClass::

ComputeIntLen[0] = &GClass::ComputeILS;
ComputeIntLen[1] = &GClass::ComputeILE;
ComputeIntLen[2] = &GClass::ComputeILI;
PostStep[0] = &GClass::PSS;
PostStep[1] = &GClass::PSE;
PostStep[2] = &GClass::PSI;

错误信息非常清楚地说明了这一点:

  

ISO C ++禁止使用非限定或带括号的非静态成员函数的地址来形成指向成员函数的指针。 Say'&amp; GClass :: ComputeIntLenScattering

答案 1 :(得分:1)

您还需要将类添加到typedef中:

typedef void (GClass::*ComputeIntLenFunc)(Int_t ntracks, Int_t *trackin, Double_t *lengths);
typedef void (GClass::*PostStepFunc)(Int_t ntracks, Int_t *trackin, Int_t &nout, Int_t* trackout);

然后你的(第一个)类型意味着:这是一个指向GClass类中成员函数的指针,它带有Int_tInt_t*等等,而在你的版本中它只是指的是具有相同参数的自由函数。