передача члена класса закрытого метода в качестве указателя на функцию

Я искал это на форуме, и я попробовал несколько решений, которые я нашел здесь, но ни одно не помогло.
Моя проблема в том, что мне нужно передать закрытый член класса в качестве указателя на аргумент функции, поэтому я попытался поместить этот метод как статический, но он не работал, следует коду.

  class monitor {
public:
monitor(device *dev);
...
void exec();
void end();
virtual ~monitor();

private:
static pcap_handler process_packet(u_char *arg, const struct pcap_pkthdr* pkthdr,
const u_char * packet);
static void thread_func(monitor *mon);
device *dev;
};

и как метод используется:

void monitor::exec() {
std::thread t (monitor::thread_func, this);
}

void monitor::thread_func(monitor *mon) {
pcap_loop(mon->dev->get_descr(), -1, monitor::process_packet, reinterpret_cast<u_char*>(mon)); // error in this line
}

pcap_handler monitor::process_packet(u_char *arg, const struct pcap_pkthdr* pkthdr,
const u_char * packet) {
monitor *mon = reinterpret_cast<monitor*>(arg);

...
}

Ошибки были:

error: invalid conversion from ‘void (* (*)(u_char*, const pcap_pkthdr*, const u_char*))(u_char*, const pcap_pkthdr*, const u_char*) {aka void (* (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*))(unsigned char*, const pcap_pkthdr*, const unsigned char*)}’ to ‘pcap_handler {aka void (*)(unsigned char*, const pcap_pkthdr*, const unsigned char*)}’ [-fpermissive]

error: initializing argument 3 of ‘int pcap_loop(pcap_t*, int, pcap_handler, u_char*)’ [-fpermissive]

следует коду прототипов функций libpcap

typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes);

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);

Я попробовал несколько решений, объясненных в другом посте как:

нить в классе

Закрытая функция-член, которая принимает указатель на закрытый член в том же классе

C ++: вызов функции-члена через указатель

Указатель на проблему с функциями класса

Но ни один из этих постов не решил мою проблему, так что, у кого-нибудь есть совет?

Спасибо…

0

Решение

process_packet это функция, возвращающая pcap_handler, Это не pcap_handler,

Чтобы сделать это pcap_handlerизмените его строку на:

static void process_packet(u_char *arg, const struct pcap_pkthdr* pkthdr,
const u_char * packet);
1

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

Других решений пока нет …

По вопросам рекламы [email protected]