1

我将我的代码分成多个文件,但这是我不明白的一件事。

在 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);
    ...
}

它仍然给我一个错误(一个不同的错误)。有什么办法可以解决这个问题?

4

2 回答 2

0

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

于 2013-09-06T07:35:58.223 回答
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 次。

于 2013-09-06T10:54:38.497 回答