[英]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.