[英]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對此並不了解。 因此,錯誤。
您有三種選擇:
擺脫VideoOpenGL
類,使glutKeyboard()
成為獨立函數。
保留VideoOpenGL
類,但將glutKeyboard()
聲明為static
以刪除this
參數。 這確實意味着glutKeyboard()
將不再能夠直接訪問VideoOpenGL
類的非靜態成員。 glutKeyboardFunc()
不允許您將用戶定義的值傳遞給glutKeyboard()
因此您需要聲明自己的全局VideoOpenGL*
指針,該指針指向VideoOpenGL
對象,然后您可以通過該指針訪問其非靜態成員。
創建一個代理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.