2

这是一个很好的例子:我正在尝试重载 OpenGL glutMouseFunc,以便它可以接受我选择的命名空间和类函数。特别是Init::DisplayInit::mouse,它是静态的。问题是,这可能吗?如果是这样,这是如何实现的?

我的实现

void glutMouseFunc(void (Init::DisplayInit::*mouse)(int, int, int, int)) {
    (*mouse);
}

实施错误

..\OpenGL_03\/displayinit.h:27: error: variable or field 'glutMouseFunc' declared void
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int'
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int'
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int'
..\OpenGL_03\/displayinit.h:27: error: expected primary-expression before 'int'
..\OpenGL_03\/displayinit.h:27: error: void value not ignored as it ought to be

注意,我把函数的声明放在同一个文件的头文件中。我还确保函数的声明定义都驻留在命名空间声明之外(它包装了两个文件的大部分)。如图所示,第一个错误将函数读取为变量或字段 (???)。

4

2 回答 2

5

这不是一个合理的定义方式glutMouseFunc。它不应该立即调用回调,它应该保存一个指针供以后使用(当鼠标活动发生时)。

调用 GLUT 提供的版本,并传递函数的地址:

#include <GL/glut.h>
glutMouseFunc(&Init::DisplayInit::mouse);

静态成员函数与普通函数指针兼容。

于 2011-12-30T02:29:00.383 回答
4

标题问题的答案是“是的;函数可以接受静态函数指针作为参数”。

您没有在使用它的函数中指向函数参数规范的指针中指定命名空间或类:

void glutMouseFunc(void (*mouse)(int, int, int, int)) {
    (*mouse)(1, 2, 3, 4);
}

您确实在函数调用中指定了命名空间或类:

glutMouseFunc(Init::DisplayInit::mouse);
于 2011-12-30T02:22:08.933 回答