2011-12-30 115 views
2

下面是一个很好的例子:我试图重载OpenGL的glutMouseFunc,以便它可以接受我选择的命名空间和类函数。其中特别的是Init::DisplayInit::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 

注意

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

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

+0

错误消息中的名称与代码片段不匹配。显示实际的代码。 – 2011-12-30 02:25:23

+0

第一个错误表明编译器认为你是由于冒号而指定了一个位域或附近;其余的错误表明编译器仍然感到困惑。 – 2011-12-30 02:27:25

回答

5

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

呼叫过剩提供的版本,并通过您的函数的地址:

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

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

+2

你不需要那里的符号,是吗? – 2011-12-30 02:38:03

+1

@JonathanLeffler:对于松散的函数和静态成员,编译器会发现,即使没有运算符地址,你也希望创建一个函数指针。对于非静态成员,必须使用&符号。但是我总是使用&符号来说明事实上我正在传递函数的地址,这样就更加清晰了。仅仅因为你可以隐含地接受地址并不意味着你应该。同样,在调用函数时,我更愿意使用'(* func_ptr)()',即使'func_ptr()'也可以。 – 2011-12-30 02:41:39

4

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

你不指定指针的命名空间或类使用它的功能在功能参数规格:

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

您指定的函数调用的命名空间或类:

glutMouseFunc(Init::DisplayInit::mouse); 
+0

我知道这个问题没有强调这一点,但[glutMouseFunc'](http://www.opengl.org/resources/libraries/glut/spec3/node50.html)应该安装一个回调函数,而不是调用提供的函数功能。 – 2011-12-30 02:32:49

+0

好的 - 那是......不清楚(并且需要OpenGL的详细知识 - 或者至少比我有更多的知识)。这个符号比函数更接近函数调用,所以我将它转换为调用。如果它设置了一个回调函数,那么就需要像'cb_func_ptr = mouse;'这样的东西。 – 2011-12-30 02:37:18