【问题标题】:Void Overload incompatible with glutDisplayFunc无效重载与 glutDisplayFunc 不兼容
【发布时间】:2016-08-15 17:58:01
【问题描述】:

目前,我正在使用 GLUT 编写一个小型引擎。我一直被困在这个非常令人沮丧的问题上。我在网上看到的所有解决方案似乎都没有帮助我。

我有一个名为 glutDisplayFunc 的函数:

void Window::Initialize(int argc, char ** argv, void* renderFunc)

renderFunc 是我传递给 glutDisplayFunc 的参数,如下所示:

glutDisplayFunc(renderFunc);

每当我把它扔进去时,虽然我得到了这个错误:

“void ”类型的参数与“void ()()”类型的参数不兼容

我完全不知道如何解决这个问题。

无论出于何种原因,您可能需要额外的代码来调试它。这是我正在处理的渲染和初始化函数。

void Window::Initialize(int argc, char ** argv, void* renderFunc)
{
    Debug debug;
    Window localWindow;
    Core::Shader_Loader shaderLoader;
    program = shaderLoader.CreateProgram("shader.vert", "shader.frag");

    system("title Sandbox");



    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(WindowPosX, WindowPosY);
    glutInitWindowSize(WindowWidth, WindowHeight);
    glutCreateWindow(title);

    glutInit(&argc, argv);
    glewInit();
    if (glewIsSupported("GL_VERSION_4_3"))
    {
        debug.Message("GLEW Version 4.3");
    }
    else
    {
        debug.Error(101, "GLEW 4.3 is not supported");
    }

    glEnable(GL_DEPTH_TEST);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    glutDisplayFunc(renderFunc);
    glutMainLoop();
}

void Window::RenderScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0, 0.0, 0.0, 1.0);

    glUseProgram(program);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glutSwapBuffers();
}

【问题讨论】:

  • 我很久没有用 C++ 编写代码了,但是你的错误似乎告诉你 glutDisplayFunc(renderFunc); 没有返回任何东西。因此,如果您将其用作参数,它将失败,因为它没有给您任何回报。

标签: c++ opengl visual-c++ glut


【解决方案1】:

glutDisplayFunc 将指向函数的指针作为其参数。 void* renderFunc 声明一个指向数据(未知类型)的指针。这些类型不兼容。

你需要:

void Window::Initialize(int argc, char ** argv, void (*renderFunc)())

【讨论】:

  • 太棒了!谢谢您的帮助!不过,我遇到了一个小问题。在 main.cpp 中,当我调用函数 window.Initialize(argc,argv,window.RenderScene);我收到另一个错误消息,说“非标准语法;使用 '&' 创建一个指向成员的指针”。我觉得这很容易解决,但这不是我以前处理过的问题。
  • 尝试window.Initialize(argc, argv, &Window::RenderScene); - 如果Window::RenderScenestatic 成员函数。
【解决方案2】:

glutDisplayFunc 需要一个指向返回 void 且不带参数的函数的指针。您作为参数传递的是指向 void 的指针。这些是非常不同的东西,实际上甚至可能有不同的大小。

正确的类型是void (*)(void),要使用它定义变量或参数符号,您可以编写void (*name)(void)

)(void) – 类型不匹配”。成员函数有一个“隐藏”/隐式第一个参数this。 GLUT 不知道如何处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 2021-02-07
    • 2023-03-16
    • 2018-07-04
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多