Le problème est que Renderer::animate
est une fonction de classe et a donc un paramètre caché this
. glutTimerFunc
ne sait pas quelle valeur de this
passer, donc si vous avez essayé de vous faufiler devant le compilateur avec un casting méchant, il se bloquerait à l'exécution.
La solution consiste à remplacer Renderer::animate
par une méthode statique ou une fonction globale ordinaire. Vous devez ensuite stocker le pointeur sur votre Renderer
exemple dans une variable globale, par exemple:
class Renderer
{
static void staticAnimate(int value);
void animate(int value);
...
};
Renderer *gRenderer = ...;
void Renderer::staticAnimate(int value)
{
gRenderer->animate(value);
}
...
glutTimerFunc(TIMERMSECS, &Renderer::staticAnimate, 0);
Si sizeof(void*) <= sizeof(int)
(true sur les systèmes 32 bits, mais pas vrai sur les systèmes 64 bits), vous pouvez alors passer aussi instance via le paramètre value
; Cependant, puisque ce n'est pas portable et vous n'aurez jamais besoin d'appeler glutTimerFunc
sur plusieurs instances différentes simultanément, vous ne devriez pas avoir à vous soucier d'utiliser une variable globale pour cela.
pour gRenderer im obtenir ce -> erreur C2227: gauche '-> Animer' doit pointer vers la classe/struct/union/type générique erreur C2227: gauche '-> Animer' doit pointer vers la classe/struct/union/type générique – Aero