繁体   English   中英

gluTessCallback错误C2440

[英]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:“类型转换”:无法从“重载函数”转换为“无效(__stdcall *)(无效)”

为什么会出现此编译错误?

Visual Studio上的错误ID C2440是类型转换错误。

在你的代码的问题是,你正在试图通过一个类的方法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()无法再访问类变量。 在您看来,这似乎不成问题,因为它现在没有这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM