Ошибка компиляции при регистрации обратных вызовов в openGL - PullRequest
3 голосов
/ 15 сентября 2011

Я только начал изучать openGL пару часов назад для своей работы, и мне было поручено рендерить вогнутый многоугольник с использованием тесселяции. Я пытаюсь скомпилировать следующий код:

#ifndef CALLBACK
#define CALLBACK
#endif

#include "GL/gl.h"
#include "GL/glu.h"

void CALLBACK beginCallback(GLenum which);

void drawHook()
{
   GLUtesselator* tessObj = gluNewTess();
   gluTessCallback(tessObj, GLU_TESS_BEGIN, beginCallback);
}

void CALLBACK beginCallback(GLenum which)
{
    glBegin(which);
}

, которое я получил из Руководства по программированию OpenGL, седьмое издание , с соответствующей главой также , доступной онлайн . Но возвращается следующая ошибка:

hook.cc:28: error: invalid conversion from ‘void (*)(GLenum)’ to ‘void (*)()’
hook.cc:28: error: initializing argument 3 of ‘void gluTessCallback(GLUtesselator*, GLenum, void (*)())’

Эта ошибка заставляет меня поверить, что третий аргумент gluTessCallback должен быть функцией, которая не принимает аргументов, однако «официальная» ссылка openGL утверждает иное.

Я что-то здесь упускаю или книга неверна?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

В документации, которую вы связали, говорится, что третий аргумент gluTessCallback является функцией без параметров.(сразу после заголовка Процедуры обратного вызова тесселяции )

Однако в примере 11-1 фактический указатель функции приводится к параметру без параметров:

gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid (*) ()) &errorCallback);
                                      ^^^^^^^^^^^^^^^ 
2 голосов
/ 15 сентября 2011

Книга верна. Вам просто нужно привести указатель функции к void(*)(). Это необходимо, потому что тип не является (и не может быть) точным.

gluTessCallback(tessObj, GLU_TESS_BEGIN, (void(*)())&beginCallback);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...