0

テンプレート化された SpecialisedRedBlackTree クラスがあります。

私の月のクラスはそうではありません。

私の Month クラスには、SpecializedRedBlackTree のインスタンスであるプライベート メンバーがあります。

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 (T, T) を期待するテンプレート化されたクラスに bool (Day, Day) ポインターを渡しているためです。

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::function関数ポインタの代わりに、またはboost::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 に答える