我正在尝试使用函数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:&#39;输入&#39; :无法转换为超载功能&#39; to&#39; void(__stdcall *)(void)&#39;
为什么我会收到此编译错误?
答案 0 :(得分:1)
Visual Studio上的错误ID C2440是类型转换错误。
你的代码中的问题是你试图将类方法Tessellation::tessError()
作为函数指针传递给gluTessCallback()
,它需要一个指向全局C风格函数的指针。
类方法与free / global函数非常不同,你不能将它作为一个简单的函数指针传递,因为它需要一个对象每次都跟着它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()
无法再访问类变量。这对你来说似乎不是一个问题,因为它现在没有这样做,它出现了。