Перемещение функции обратного вызова в класс приводит к ошибке! - PullRequest
1 голос
/ 29 апреля 2011

После того, как я переместил некоторый код OpenGL из основной функции в новый класс, в следующей строке возникла следующая ошибка:

glutDisplayFunc(OnDisplay);

ошибка C3867: 'Room :: OnDisplay': вызов функциисписок отсутствующих аргументов;используйте '& Room :: OnDisplay', чтобы создать указатель на участника

В чем была моя вина?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

glutDisplayFunc ожидает void (*func)(void), но вы передаете void (Room::*func)(void).

Поскольку методы класса получают неявный параметр this, их типы указателей принципиально отличаются от обычных указателей на функции,Между ними невозможно преобразование.

Все, что вы можете сделать, это сделать OnDisplay статическим членом Room.Оттуда вы можете переадресовать вызов функции-члену конкретного экземпляра Room (поскольку в проекте предусмотрен только один обратный вызов дисплея с перенасыщением и вы перешли с процедурного кода, я предполагаю, что у вас есть только один объект Room).

2 голосов
/ 29 апреля 2011

glutDisplayFunc просто принимает указатель на функцию. При перемещении OnDisplay в класс вы также передадите скрытый аргумент this в glutDisplayFunc при фактическом вызове.

Одно из возможных решений - сделать OnDisplay статическим методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...