繁体   English   中英

无法将类型'void(classname ::)(unsigned char,int,int)'的'classname :: glutKeyboard'转换为类型'void(*)(unsigned char,int,int)'的类型

[英]cannot convert 'classname::glutKeyboard' from type 'void (classname::)(unsigned char, int, int)' to type 'void (*)(unsigned char, int, int)'

我已经在C ++中创建了kinect应用程序,但是我的glut函数,void glutKeyboard,glutDisplay,glutIdle也有相同的错误。 在下面的示例中,我在主文件中声明了all函数,因此不需要类,但在我的应用程序中需要,但是该类通过声明函数的范围而生成错误。

这和函数头的声明:

class VideoOpenGL : public QGLWidget
{
    Q_OBJECT
public:
    explicit VideoOpenGL(QWidget *parent = 0);

protected:
   // /*
    void initializeGL();
    //void resizeGL(int w, int h);
    //void paintGL();
    void glutKeyboard (unsigned char key, int /*x*/, int /*y*/);
    void glutDisplay(void);
    void glutIdle (void);
    void CleanupExit();
    void LoadCalibration();
    void SaveCalibration();
  // */
signals:

public slots:

};

这是我的功能glutKeyboard

    void VideoOpenGL::glutKeyboard (unsigned char key, int /*x*/, int /*y*/)
{
    switch (key)
    {
    case 27:
        CleanupExit();
    case 'b':
        // Draw background?
        g_bDrawBackground = !g_bDrawBackground;
        break;
    case 'x':
        // Draw pixels at all?
        g_bDrawPixels = !g_bDrawPixels;
        break;
    case 's':
        // Draw Skeleton?
        g_bDrawSkeleton = !g_bDrawSkeleton;
        break;
    case 'i':
        // Print label?
        g_bPrintID = !g_bPrintID;
        break;
    case 'l':
        // Print ID & state as label, or only ID?
        g_bPrintState = !g_bPrintState;
        break;
    case 'f':
        // Print FrameID
        g_bPrintFrameID = !g_bPrintFrameID;
        break;
    case 'j':
        // Mark joints
        g_bMarkJoints = !g_bMarkJoints;
        break;
    case'p':
        g_bPause = !g_bPause;
        break;
    case 'S':
        SaveCalibration();
        break;
    case 'L':
        LoadCalibration();
        break;
    }
}

现在调用功能

 glutKeyboardFunc( glutKeyboard );

glutKeyboardFunc()希望指定的回调是一个独立的函数,但是您要指定一个非静态的类方法,该方法不兼容,因为隐藏了this参数,而glut对此并不了解。 因此,错误。

您有三种选择:

  1. 摆脱VideoOpenGL类,使glutKeyboard()成为独立函数。

  2. 保留VideoOpenGL类,但将glutKeyboard()声明为static以删除this参数。 这确实意味着glutKeyboard()将不再能够直接访问VideoOpenGL类的非静态成员。 glutKeyboardFunc()不允许您将用户定义的值传递给glutKeyboard()因此您需要声明自己的全局VideoOpenGL*指针,该指针指向VideoOpenGL对象,然后您可以通过该指针访问其非静态成员。

  3. 创建一个代理thunk,该实现为glutKeyboardFunc()调用实现兼容的接口,并让thunk在内部将其工作委托给VideoOpenGL对象。

更改

void glutKeyboard (unsigned char key, int /*x*/, int /*y*/);

如果您想按自己的方式使用静态成员函数。

static void glutKeyboard (unsigned char key, int /*x*/, int /*y*/);

暂无
暂无

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

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