gluTessCallback error C2440

Я пытаюсь использовать функцию gluTessCallback но я получаю ошибку C2440. Понятия не имею почему.

Вот код:

#define callback void(CALLBACK*)()

template<typename T>
class Tessellation
{
private:
GLUtesselator *pTess;

void CALLBACK tessError(GLenum error)
{
sendErrorMessage((char *)gluErrorString(error), true);
}public:

void Triangulation3D(T* & point, short numOfPoints)
{
pTess = gluNewTess();

gluTessCallback(pTess, GLU_TESS_ERROR,      (callback)tessError);
}
};

Ошибка в функции gluTessCallback:

ошибка C2440: «приведение типа»: невозможно преобразовать из «перегруженной функции» в «void (__stdcall *) (void)»

Почему я получаю эту ошибку компиляции?

1

Решение

Идентификатор ошибки C2440 в Visual Studio — ошибка преобразования типа.

Проблема в вашем коде в том, что вы пытаетесь передать метод класса Tessellation::tessError() как указатель на функцию gluTessCallback(), который ожидает указатель на глобальную функцию в стиле C.

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

Решением вашей проблемы было бы объявить tessError() в качестве статического метода, делая его фактически таким же, как свободная / глобальная функция, находящаяся внутри класса, например:

template<typename T>
class Tessellation
{
private:

static void CALLBACK tessError(GLenum error)
{
sendErrorMessage((char *)gluErrorString(error), true);
}
...

И передать это gluTessCallback():

gluTessCallback(pTess, GLU_TESS_ERROR, (callback)&Tessellation<T>::tessError);

Единственным недостатком этого подхода является то, что статический tessError() больше не может получить доступ к переменным класса. Что не кажется вам проблемой, так как сейчас это не так, кажется.

1

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


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