C2276 '&':对绑定成员函数表达式的非法操作

C2276 '&': illegal operation on bound member function expression

本文关键字:表达式 非法 操作 函数 绑定 C2276 成员      更新时间:2023-10-16

我想将指向我的类 JQCollider 构造函数中的函数的指针用作参数。但是我在构造对象时收到此错误。

在我得到错误"非标准语法;使用"&"创建指向成员的指针,因此我向每个指向成员参数的指针添加了"&"。但是当我编译时,我现在收到此错误。

class JQCollider
{
public:
    JQCollider()
    {
    }
    JQCollider(FloatRect getBounds(), Vector2f getPos(),void setPos(Vector2f pos))
    {
    getObjPos = getPos;
    getObjBounds = getBounds;
    setObjPos = setPos;
    }
private:
    Vector2f(*getObjPos)();
    FloatRect(*getObjBounds)();
    void(*setObjPos)(Vector2f);
}
class JQTextBox
{
public:
    JQTextBox()
    {
    }
    void Initialize()
    {
    collision = JQCollider(&textBoxSprite.getGlobalBounds, &textBoxSprite.getPosition, &textBoxSprite.setPosition);
    }
private:
    JQCollider collision;
    Sprite textBoxSprite;
}

不能创建指向特定实例的成员函数的函数指针。相反,请使用 std::function 和 std::bind:

#include <functional>
class JQCollider
{
public:
    JQCollider()
    {}
    JQCollider(std::function<FloatRect>()> getBounds, std::function<Vector2f>()> getPos,
        std::function<void(Vector2f)> setPos)
    {
        getObjPos = getPos;
        getObjBounds = getBounds;
        setObjPos = setPos;
    }
private:
    std::function<Vector2f>()> getObjPos;
    std::function<FloatRect>()> getObjBounds;
    std::function<void(Vector2f)> setObjPos;
}
class JQTextBox
{
public:
    JQTextBox()
    {}
    void Initialize()
    {
        collision = JQCollider(std::bind(&Sprite::getGlobalBounds, textBoxSprite),
            std::bind(&Sprite::getPosition, textBoxSprite),
            std::bind(&Sprite::setPosition, textBoxSprite, std::placeholders::_1));
    }
private:
    JQCollider collision;
    Sprite textBoxSprite;
}