2010-05-14 99 views
0

我有一個模板化的SpecialisedRedBlackTree類。成員函數指針不太正確

我的月課不是。

在我Month類我有一個私有成員是SpecialisedRedBlackTree的一個實例:

SpecialisedRedBlackTree<Day> m_windSpeedTree; 

正如你可以看到它會採取Day類/對象(請糾正我在任何方面,我拿錯) 。

在我Month類,我傳遞的方法函數指針,這個方法的方法:

bool Month::CompareWindSpeed(Day a, Day b) { 
return (a.GetData(WIND_SPEED_CODE) < b.GetData(WIND_SPEED_CODE)? true : false); 
} 

bool (Month::*myFuncPtr)(Day, Day); 
myFuncPtr = &Month::CompareWindSpeed; 
m_windSpeedTree.Insert(dayReading, myFuncPtr); 

但因爲我傳遞一個布爾(日,日)指針模板類期待布爾(T ,T)的這....模板

Error 1 error C2664: 'SpecialisedRedBlackTree<T>::Insert' : cannot convert parameter 2 from 'bool (__thiscall Month::*)(Day,Day)' to 'bool (__cdecl *)(T,T)' 

任何意見

T是一部分?

+0

'SpecialisedRedBlackTree'有什麼特別之處?你想達到什麼目的?也許我們可以提出更好的解決方案? – 2010-05-14 06:14:41

+0

'SpecialisedRedBlackTree :: insert'函數的簽名是什麼? – Naveen 2010-05-14 06:23:43

回答

0

關於函數指針,對象的函數與普通函數不同。您需要存儲對它自己的對象的引用,也需要存儲函數指針以便能夠調用它。

例如類存儲functior和對象指針:

template <class TObj, typename TArg> 
class ObjDelegate 
{ 
public: 
typedef void (TObj::*TFunct)(TArg&); 

ObjDelegate(TObj* t, TFunct f) 
{ 
    m_pObj = t; 
    m_pFunct = f; 
} 

virtual void operator()(TArg& a) 
{ 
    if (m_pObj && m_pFunct) 
    { 
    (*m_pObj.*m_pFunct)(a); 
    } 
} 

TFunct m_pFunct; // pointer to member function 
TObj* m_pObj;  // pointer to object 
}; 

要使用它,你可以這樣做:

ObjDelegate<MyClass, MyParam> objDel = new ObjDelegate(this, MyClass::MyMethod); 

要觸發的函數調用:

MyParam myParamInstance; 
objDel(myParamInstance); 
+0

你*不能*在普通函數指針預期的上下文中將其視爲正常函數。實際上,C++語言不提供將成員函數指針轉換爲獨立(普通)函數指針的方法。這根本不可能,沒有使用平臺特定的黑客。換句話說,直到樹接口更改爲接受函子,您的解決方案將不會真正解決任何問題。 – AnT 2010-05-14 06:31:36

+0

那麼,他可以改爲接受ObjDelegate,而不是使用函子。 – Lodle 2010-05-14 06:33:55

2

此時的問題不是該類是模板化的,而是您傳遞的是一個非m的成員函數預計會有燼函數。

您可以:

  • 使CompareWindSpeed()自由函數或靜態成員函數
  • Insert()採取一個成員函數指針和一個實例指針
  • 使用tr1::functionboost::function或類似的包裝,而不是功能指針