首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL镶嵌回调未执行

OpenGL镶嵌回调未执行
EN

Stack Overflow用户
提问于 2013-01-10 02:53:58
回答 1查看 623关注 0票数 5

我使用示例here将我的镶嵌回调移动到不同的类。

代码会编译,但回调代码永远不会执行。

回调类:

代码语言:javascript
复制
template <class Class, typename ReturnType, typename Parameter>
class SingularCallBack
{
public:

    typedef ReturnType (Class::*Method)(Parameter);

    SingularCallBack(Class* class_instance, Method method)
        : class_instance_(class_instance),
        method_(method)
    {}

    ReturnType operator()(Parameter parameter)
    {
        return (class_instance_->*method_)(parameter);
    }

    ReturnType execute(Parameter parameter)
    {
        return operator()(parameter);
    }

private:

    Class* class_instance_;
    Method method_;
};

回调:

代码语言:javascript
复制
void MyClass::tessBegin(GLenum which)
{
    glBegin(which);
    cout << "BEGIN CALLBACK IS WORKING";
}

void MyClass::tessVertex(const GLvoid *data)
{
    // cast back to double type
    const GLdouble *ptr = (const GLdouble*)data;

    glVertex3dv(ptr);
    cout << "VERTEX CALLBACK IS WORKING";
}

我要在其中注册它们的镶嵌函数:

代码语言:javascript
复制
int MyClass::TessellatePolys()
{
    GLUtesselator *tess = gluNewTess(); // create a tessellator
    if(!tess) return 0;  // failed to create tessellation object, return 0

    // register callback functions
    SingularCallBack<GLOrtho, void, GLenum>*BeginCallback;
    BeginCallback = new SingularCallBack<GLOrtho, void, GLenum>(this,&GLOrtho::tessBegin);
    gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK *)())BeginCallback);

    SingularCallBack<GLOrtho, void, const GLvoid*>*VertexCallback;
    VertexCallback = new SingularCallBack<GLOrtho, void, const GLvoid*>(this,&GLOrtho::tessVertex);
    gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK *)())VertexCallback);

    ... (do tessellation) ...

    return id;
}

注册回调的方式有什么问题?

EN

回答 1

Stack Overflow用户

发布于 2013-11-14 04:55:23

您正在将指向对象类型的指针转换为指向函数类型的指针(例如,将"BeginCallback“转换为"void (CALLBACK *)()")。这些类型是不兼容和无关的。代码进行编译,因为它是c风格的转换,没有任何类型检查。更重要的是,从C++编译器的角度来看,BeginCallback和VertexCallback是不同且不兼容的类型,函数gluTessCallback无法调用它们的重载运算符()--它们是不同的成员函数。

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

https://stackoverflow.com/questions/14244406

复制
相关文章

相似问题

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