使用 boost::bind 时出错

Error using boost::bind

假设我有一个函数数组:

name::Function _actions[10];

name::Function 只是 std::function 的包装:

class Function{
    public :
        std::function<void(float dt)> Function;

        void exec(float dt){


            Function(dt);
        }
};

现在我有一个函数可以使它通用,这样它就可以绑定任何 classes 函数:

template<class T>
void bindFunction(int action,void (T::*function)(float) , T* classPtr)
{
    _actions[action] = boost::bind(&function, this, boost::placeholders::_1);
}

并想在继承此方法的 class 中使用它(基础 class 是通用的,但我认为这应该不是问题)

    DefaultMovableEntity()
    {
        bindFunction(1, &DefaultMovableEntity::func1, this);
    }

    void func1(float dt)
    {
        //Code
    }

但是我不断收到错误消息:

主要问题是什么?我以为我做的一切都是对的。谢谢。

编辑 1 从函数中删除 & 并替换它后出现以下错误:

您的代码有几个问题:

  1. 您不能将 bind 结果分配给数组,因为您的数组成员类型是 Function,而不是 std::function

  2. 您需要删除 &,如之前在评论中所述。

  3. 您名为 Function 的成员与 class 名称相同,因此编译器可能认为您正在尝试调用 class 构造函数。

以下代码应该有效:

class Function {
public:
    std::function<void(float)> func;

    void exec(float dt) {
        func(dt);
    }
};

bindFunction代码:

template<class T>
void bindFunction(int action, void (T::*function)(float), T* classPtr)
{
    _actions[action].func = boost::bind(function, classPtr, boost::placeholders::_1);
}

不过,我建议对函数 class 稍作改进,使其不直接暴露其成员:

class Function
{
private:
    std::function<void(float)> func;

public:
    Function() = default;
    Function(std::function<void(float)> f) : func(f) { }

    void exec(float dt) {
        func(dt);
    }
};

和你的bindFunction对应的变化:

template<class T>
void bindFunction(int action, void (T::*function)(float), T* classPtr)
{
    _actions[action] = Function(boost::bind(function, classPtr, boost::placeholders::_1));
}