2013-05-20 74 views
0

我想写一个使用GLEW的小类,我在石墙前,因为我不明白如何绕过编译器给我的问题。函数指针返回不同的类类型

使用VS2012快递这里面的代码

void OpenGlRendering::InitWindow(int argc, char* argv[]) 
{ 
    glutInit(&argc, argv); 

    glutInitContextVersion(4, 0); 
    glutInitContextFlags(GLUT_FORWARD_COMPATIBLE); 
    glutInitContextProfile(GLUT_CORE_PROFILE); 

    glutSetOption(
     GLUT_ACTION_ON_WINDOW_CLOSE, 
     GLUT_ACTION_GLUTMAINLOOP_RETURNS 
    ); 

    glutInitWindowSize(CurrentWidth, CurrentHeight); 

    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 

    WindowHandle = glutCreateWindow(WINDOW_TITLE_PREFIX); 

    if(WindowHandle < 1) { 
     exit(EXIT_FAILURE); 
    } 

    glutReshapeFunc(OpenGlRendering::ResizeFunction); 
    glutDisplayFunc(RenderFunction); 
    glutIdleFunc(IdleFunction); 
    glutTimerFunc(0, TimerFunction, 0); 
    glutCloseFunc(Cleanup); 
    glutKeyboardFunc(KeyboardFunction); 
} 

void OpenGlRendering::ResizeFunction(int Width, int Height) 
{ 
    CurrentWidth = Width; 
    CurrentHeight = Height; 
    glViewport(0, 0, CurrentWidth, CurrentHeight); 
} 
void OpenGlRendering::IdleFunction(void) 
{ 
    glutPostRedisplay(); 
} 

我有了这个编译器错误:

IntelliSense: argument of type "void (OpenGlRendering::*)(int Width, int Height)" is incompatible with the parameter type "void (*)(int, int)"

使用一些类之前清理代码的混乱它vorking很好,因为函数存在于main.cpp中声明为普通函数

void ResizeFunction(int Width, int Height) 
{ 
    CurrentWidth = Width; 
    CurrentHeight = Height; 
    glViewport(0, 0, CurrentWidth, CurrentHeight); 
} 

and wa这叫这样

glutReshapeFunc(OpenGlRendering::ResizeFunction); 
+0

您不能将成员函数指针作为参数传递给某些需要使用非成员函数指针而不使用某些绑定方法的东西。 – GreenCoder

+1

http://www.parashift.com/c++-faq-lite/fnptr-vs-memfnptr-types.html –

+1

添加到以前的评论,您可以使成员函数静态(如果你打算这个类作为实用程序库这可能是有道理的,否则可能不会),或者创建一个封装函数,将封装对特定实例的调用,如@ThomasFenzl的链接中所述。 – AFischbein

回答

2

当你调用指向他们含蓄需要非静态成员函数/提供一个隐藏的参数(this终场前的类的实例)。由于这个隐藏的参数,你不能混合使用静态函数和非静态成员函数。这就是你想要做的。

void (OpenGlRendering::*)(int Width, int Height) 

是一个非静态成员函数,它是与一个静态函数

void (*)(int, int) 

即使明确的参数和返回类型是相等的不兼容。