Указатель функции члена не совсем прав - PullRequest
0 голосов
/ 14 мая 2010

У меня есть класс SpecialisedRedBlackTree с шаблонами.

Мой месяц месяц не.

В моем месячном классе у меня есть личный член, который является экземпляром SpecialisedRedBlackTree:

SpecialisedRedBlackTree<Day> m_windSpeedTree;

Как вы видите, это займет урок / предмет Дня (исправьте меня, если я ошибаюсь).

В моем месячном классе у меня есть метод, передающий указатель функции метода на этот метод:

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

Любой совет?

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

Проблема на данный момент не в том, что класс является шаблонным, а в том, что вы передаете функцию-член, где ожидается функция, не являющаяся членом.

Вы могли бы:

  • делает CompareWindSpeed() свободной или статической функцией-членом
  • let Insert() взять указатель на функцию-член и указатель экземпляра
  • использовать tr1::function или boost::function или аналогичные оболочки вместо указателей функций
0 голосов
/ 14 мая 2010

Функция объекта не совпадает с обычной функцией в отношении указателей на функции. Вам нужно сохранить ссылку на сам объект, а также указатель на функцию, чтобы иметь возможность вызвать его.

Например, класс для хранения функции и указателя объекта:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...