gluTessCallback错误C2440

时间:2014-08-07 10:11:06

标签: c++ opengl visual-studio-2012 compiler-errors tessellation

我正在尝试使用函数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;

为什么我会收到此编译错误?

1 个答案:

答案 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()无法再访问类变量。这对你来说似乎不是一个问题,因为它现在没有这样做,它出现了。