成员函数指针不太正确

时间:2010-05-14 06:08:33

标签: c++ function-pointers member-function-pointers

我有一个模板化的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)'

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

此时的问题不是该类是模板化的,而是您传递的成员函数需要非成员函数。

你可以:

  • 使CompareWindSpeed()成为自由函数或静态成员函数
  • Insert()获取成员函数指针和实例指针
  • 使用tr1::functionboost::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);