使用 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
从函数中删除 & 并替换它后出现以下错误:
您的代码有几个问题:
您不能将 bind
结果分配给数组,因为您的数组成员类型是 Function
,而不是 std::function
。
您需要删除 &
,如之前在评论中所述。
您名为 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));
}
假设我有一个函数数组:
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
从函数中删除 & 并替换它后出现以下错误:
您的代码有几个问题:
您不能将
bind
结果分配给数组,因为您的数组成员类型是Function
,而不是std::function
。您需要删除
&
,如之前在评论中所述。您名为
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));
}