Я пытаюсь использовать функцию 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)»
Почему я получаю эту ошибку компиляции?
Идентификатор ошибки 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()
больше не может получить доступ к переменным класса. Что не кажется вам проблемой, так как сейчас это не так, кажется.