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

但是因为我将 bool (Day, Day) 指针传递给期望 bool (T, T) 的模板类

T 是这个 .... 模板的一部分

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

有什么建议吗?

4

2 回答 2

2

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

你可以:

  • 制作CompareWindSpeed()自由函数或静态成员函数
  • 让我们Insert()取一个成员函数指针和一个实例指针
  • 使用tr1::functionorboost::function或类似的包装器代替函数指针
于 2010-05-14T06:25:49.923 回答
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);
于 2010-05-14T06:23:12.747 回答