多态性:“指向绑定函数的指针只能用于调用函数”

时间:2013-09-06 07:31:21

标签: c++ opengl pointers glut

我将我的代码分成多个文件,但这是我无法得到的一件事。

在graphics.h中:

...
class graphics {
public:
virtual void SizeMod(int w, int h);
...
}

在graphics.cpp中:

...
void SizeMod(int w, int h) {
    //Code here.
}
...

在main.cpp中:

...
graphics g;
...
int main (int argc, char **argv) {
    ...
    glutReshapeFunc(g.SizeMod);
    ...
}

错误:

error C3867: 'graphics::SizeMod': function call missing argument list; use &graphics::SizeMod to create a pointer to member

所以我这样做了:

...
graphics g;
...
int main (int argc, char **argv) {
    ...
    glutReshapeFunc(&graphics::SizeMod);
    ...
}

它仍然给我一个错误(一个不同的错误)。 什么能解决这个问题?

2 个答案:

答案 0 :(得分:0)

它不会以这种方式工作,因为SizeMod是非静态类成员方法,因此需要调用this。你必须使SizeMod静态。

答案 1 :(得分:0)

GLUT是一个C API。 glutReshapeFunction期望回调签名函数

void (int, int)

C ++类成员函数,在您的情况下,graphics :: SizeMod具有签名

graphics::void(int, int)

现在,没有明确定义的C ++ ABI可以严格地转换为普通的C ABI,但对于大多数编译器的所有实际手段来说,上面的C ++签名看起来像

void(graphics*, int, int)

如果透过C ABI的眼镜看。

第一个graphics*参数是隐式this指针。

这实质上意味着,当您将其作为回调传递给glutReshapeFunction时,它会因为

而中断
  • 类型不匹配
  • 并且无法以某种方式传递实例

编辑:如Mike Dinsdale所指出,C ++ lambdas在这里不起作用。


说真的,我真的厌倦了再次回答同样的问题,又一次又一次地回答......每周被问到3次。