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);
您不能將成員函數指針作爲參數傳遞給某些需要使用非成員函數指針而不使用某些綁定方法的東西。 – GreenCoder
http://www.parashift.com/c++-faq-lite/fnptr-vs-memfnptr-types.html –
添加到以前的評論,您可以使成員函數靜態(如果你打算這個類作爲實用程序庫這可能是有道理的,否則可能不會),或者創建一個封裝函數,將封裝對特定實例的調用,如@ThomasFenzl的鏈接中所述。 – AFischbein