2011-11-22 67 views
2

的地址我有以下成員函數:C++:綁定的成員函數

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 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++禁止採用非限定或帶括號的非靜態成員函數的地址來形成指向成員函數的指針。說 '& GClass :: ComputeIntLenScattering' 「

當我通過GClass :: FunctionNames在InitFunctions取代FunctionNames()我得到 」 不能將 '無效(GClass :: *)(Int_t,Int_t *,* DOUBLE_T)'爲「無效(*)(Int_t,Int_t *,DOUBLE_T *)」在分配」

請幫助我。什麼C的話題++是這樣嗎?

+0

OT:GClass是一類有趣的名字。如果你閱讀你的代碼,例如'GClass的東西;',這是否意味着'某物'是一個班級?也許'GObject'會稍好一些(雖然仍然非常通用)。 – Andre

回答

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*); 

我省略了參數名稱,因爲他們沒有在類型定義必需的。

而且,你已經使用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++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&GClass::ComputeIntLenScattering

1

您需要預先設置類您的typedefs以及:

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*等等,而在您的版本中,它只是指具有相同參數的自由函數。