简体   繁体   中英

Member Function Pointer not quite right

I have a SpecialisedRedBlackTree class that is templated.

My Month class is not.

In my Month class I have a private member which is an instance of SpecialisedRedBlackTree:

SpecialisedRedBlackTree<Day> m_windSpeedTree;

As you can see it will take the Day class/object (please correct me on any terms I get wrong).

In my Month class, I have a method passing a method function pointer to this method:

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);

But because I am passing a bool (Day, Day) pointer to a templated class expecting bool (T, T)

T being part of this .... template

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

Any advice?

The problem at this point is not that the class is templated, but that you are passing a member-function where a non-member function is expected.

You could:

  • make CompareWindSpeed() a free function or a static member function
  • let Insert() take a member function pointer and an instance pointer
  • use tr1::function or boost::function or similar wrappers instead of function pointers

A function of an object is not the same as a normal function in regards to function pointers. You need to store a reference to the object it self and also the function pointer to be able to call it.

For Example a class to store the functior and object pointer:

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
};

To use it you would do this:

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

To trigger the function call:

MyParam myParamInstance;
objDel(myParamInstance);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM