首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gluTessCallback误差C2440

gluTessCallback误差C2440
EN

Stack Overflow用户
提问于 2014-08-07 10:11:06
回答 1查看 524关注 0票数 1

我正在尝试使用函数gluTessCallback,但是我得到了C2440错误。我不知道为什么。

以下是代码:

代码语言:javascript
复制
#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*)(无效)”

为什么我会得到这个编译错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-07 13:51:08

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

代码中的问题是,您试图将类方法Tessellation::tessError()作为指向gluTessCallback()的函数指针传递,这需要一个指向全局C风格函数的指针。

类方法与空闲/全局函数有很大不同,您不能将它作为一个简单的函数指针传递,因为它每次都需要一个对象来跟随它,即this指针。

解决问题的一个方法是将tessError()声明为静态方法,使其实际上与类内的一个自由/全局函数相同,如下所示:

代码语言:javascript
复制
template<typename T>
class Tessellation
{
private:

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

并将其传递给gluTessCallback()

代码语言:javascript
复制
gluTessCallback(pTess, GLU_TESS_ERROR, (callback)&Tessellation<T>::tessError);

这种方法的唯一缺点是静态tessError()不能再访问类变量。这在你看来并不是个问题,因为它现在还没有这么做,它似乎。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25179786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档