我有一个模板化的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);
但是因为我将一个bool(Day,Day)指针传递给一个模板化的类,期望bool(T,T)
是这个......模板的一部分
Error 1 error C2664: 'SpecialisedRedBlackTree<T>::Insert' : cannot convert parameter 2 from 'bool (__thiscall Month::* )(Day,Day)' to 'bool (__cdecl *)(T,T)'
有什么建议吗?
答案 0 :(得分:2)
此时的问题不是该类是模板化的,而是您传递的成员函数需要非成员函数。
你可以:
CompareWindSpeed()
成为自由函数或静态成员函数Insert()
获取成员函数指针和实例指针tr1::function
或boost::function
或类似的包装器而不是函数指针答案 1 :(得分:0)
对象的函数与函数指针的正常函数不同。你需要存储对它自己的对象的引用,以及能够调用它的函数指针。
例如,存储函数和对象指针的类:
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);