过剩 - 请求非类型的成员

时间:2016-03-02 16:26:51

标签: c++ glut

我有一个MouseController类。有一种方法 - 更新。

void MouseController::update(int x, int y) {
this->mX = x;
this->mY = y;

this->diffX = mX  - 650;
this->diffY = mY - 350;

calculateAngle();
}

我正在使用过剩。我想制作glutPassiveMotionFunc并放置更新功能。

glutPassiveMotionFunc(mouse.update);

我收到以下错误:

  

D:\ projects \ cpp \ _过剩\ main.cpp | 129 |错误:请求成员'更新'   在'mouse'中,它是非类型的'MouseController()'

2 个答案:

答案 0 :(得分:1)

问题

mouse定义为

MouseController mouse();

你定义一个不带参数的函数,返回MouseController,称为mouse。然后,当你打电话

glutPassiveMotionFunc(mouse.update);

您尝试访问函数update的成员mouse。因此错误信息。

解决方案

MouseController mouse;

(只有在MouseController::update(int,int)静止的情况下才有效,但事实并非如此。)

真正的解决方案

MouseController mouse;
glutPassiveMotionFunc([&](int x, int y){mouse.update(x, y)});

答案 1 :(得分:0)

以下是glutPassiveMotionFunc

的签名
void glutPassiveMotionFunc(void (*func)(int x, int y));

正如您所看到的,它接受一个带有两个整数作为参数的函数指针。在C ++中,您无法获得指向非静态成员函数的指针,因为非静态成员函数具有implict第一个参数this,该参数对于类的每个实例都是唯一的。

你可以尝试在MouseController中存储一个指向更新函数的函数指针,然后将其传递给glutPassiveMotionFunc

这将为您提供一种获取指向函数的指针,但仍然不匹配需要传递给glutPassiveMotionFunc的函数指针的签名。看看另一个响应者的解决方案,让lambda做到这一点。