2012-11-27 161 views
1

可能重複:
Cast pointer to member function to normal pointer成員函數指針指向函數指針?

有一些代碼

class TT { 
public: 
    void set(); 
    void par1(int, int); 
    void par2(double, double); 
}; 

typedef void(*Ptr1)(TT &, int, int); 

typedef void(*Ptr2)(TT &, double, double); 

void hello(Ptr1, Ptr2){...} 

void TT::set() 
{ 
    hello(&TT::par1, &TT::par2); 
} 

和錯誤顯示:

error C2664: 'hello' : cannot convert parameter 1 from 'void (__thiscall TT::*)(int,int)' to 'Ptr1' 

請告訴我如何解決這個問題?

回答

3

你想這樣做

typedef void(TT::*Ptr1)(int, int);
typedef void(TT::*Ptr2)(double, double);

和修復Hello功能採取指針this因爲你需要this指針調用對象上的功能。

void hello(TT* obj,Ptr1 x, Ptr2 y){ 
    (obj->*x)(1,2); 
} 

檢查this post瞭解更多關於成員函數指針的信息。

+0

函數hello()不需要這個指針。我認爲主要的問題是Ptr1和Ptr2需要一個指向這個的指針。 – user1855182

+0

這些函數不會接受指針,這是調用者的責任。所以hello函數(或者存儲/調用Ptr1/Ptr2的任何人)需要保留'this'指針並將其用作'(this - > * ptr1)(2,3);' –

+0

我認爲perls模型接近於你在暗示什麼......因爲這個對象是作爲第一個參數傳遞的......但是這不是perl。如果你想這樣做你將如何理解它,你將需要製作2個靜態版本的par1/par2,它將'this'指針作爲第一個參數,並用它來調用非靜態版本 –