2013-05-20 95 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) 

即使明確的參數和返回類型是相等的不兼容。