2013-05-20 1 views
0

저는 GLEW를 사용하는 작은 클래스를 작성하려고하는데 저는 컴파일러가 제공하는 문제를 우회하는 방법을 이해할 수 없기 때문에 돌 벽 앞에 있습니다. 가 있기 때문에 잘 vorking 된 코드의 혼란을 정리하기 위해 몇 가지 클래스를 사용하기 전에함수 포인터가 다른 클래스 유형을 반환합니다.

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

:

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(); 
} 

내가있어이 컴파일러 오류를 VS2012 Express를 내부에이 코드를 사용하여 함수는 일반 함수로 선언 된 main.cpp에 있습니다.

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

및 wa 당신은 그들이 절대적으로 필요 비 정적 멤버 함수에 대한 포인터를 호출 할 때이

glutReshapeFunc(OpenGlRendering::ResizeFunction); 
+0

일부 바인딩 메서드를 사용하지 않고 비 멤버 함수 포인터를 필요로하는 것으로 멤버 함수 포인터를 인수로 전달할 수 없습니다. – GreenCoder

+1

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

+1

이전 주석에 추가하면 멤버 함수를 정적으로 만들 수 있습니다 (이 클래스를 유틸리티 라이브러리로 사용하려는 경우 @ThomasFenzl의 링크에 설명 된대로 특정 인스턴스에 대한 호출을 캡슐화 할 래퍼 함수를 ​​만들 수 있습니다. – AFischbein

답변

2

처럼라는 S/숨겨진 인수 (클래스의 인스턴스에 this -pointer를) 제공합니다. 이 숨겨진 인수로 인해 정적 함수와 비 정적 멤버 함수를 섞을 수 없습니다. 이것이 당신이하려는 일입니다.

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

정적 함수 명시 적 인수 및 반환 유형이 동일하더라도

void (*)(int, int) 

호환되지 않는 비 정적 멤버 함수이다.

관련 문제