簡體   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