我将我的代码分成多个文件,但这是我无法得到的一件事。
在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);
...
}
它仍然给我一个错误(一个不同的错误)。 什么能解决这个问题?
答案 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次。