2010-05-14 101 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或类似的包装,而不是功能指针