использование boost :: function для сохранения указателя на функцию-член произвольного объекта

Я пытаюсь сохранить функцию-член от объекта, чтобы вызвать его, когда происходит соответствующее событие. К сожалению, этот код выдает много сообщений об ошибках. Кто-нибудь может мне помочь?

class MainPage
{
public:

MainPage::MainPage(void)
{
image1 = new STImagePanel("Untitled.png");
image1->OnPointerPressedHandler->add(&MainPage::imageMousePressed,this);
}

void MainPage::imageMousePressed(STObject* sender, STPointerEventArg * args)
{
MainPage * dsda = (MainPage*)this;
pres = true;
}

};template<class SENDERTYPE, class ARG>
struct callbackInfo
{
boost::function<void(SENDERTYPE, ARG)> func;
};

template<class SENDERTYPE, class ARG>
class STEventHandler
{
public:
template<class T, class P>
void add(T x, P that)
{
//The following line gives the error
callbackInfo<SENDERTYPE,ARG> tmp { boost::bind(x,that,_2)};
functions->addLast(tmp);
}

private:
STLinkedList<callbackInfo<SENDERTYPE,ARG>>* functions;
}

Это дает следующие ошибки:

http://pastie.org/8014181

Обновить:
со следующим исправлением работает нормально:

template<class T, class P>
void add(T x, P that)
{
boost::function<void(SENDERTYPE,ARG)> func(boost::bind(x,that,_1,_2));
callbackInfo<SENDERTYPE,ARG> tmp;
tmp.func = func;
}

0

Решение

Одна проблема, которую я вижу MainPage::imageMousePressed(STObject* sender, STPointerEventArg * args) имеет два аргумента, но в вызове boost::bind, вы связываете только _2 с отправителем. Это не работает Вы должны либо связать оба, либо передать NULL, либо какое-нибудь дозорное значение.

В целом, мне кажется, что ты изобретаешь повышение :: сигналы

0

Другие решения

Два предложения:

1) В коде, который вы не показывали, первое сообщение об ошибке могло помешать включению некоторых заголовков;

2) Вам не хватает точки с запятой в конце определения класса MainPage.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector