如何将函数指针用作模板化类的构造函数参数
How to use function pointer as a constructor argument for a templated class?
我正在尝试将函数指针作为参数传递给使用模板化函数创建的对象的参数,但是当我尝试这样做时出现此错误:
error C2664: cannot convert argument 1 from
'void (__thiscall Northland::Sword::*)(Tecs::Entity&)' to
'void (__cdecl *)(Tecs::Entity&)'
由此产生的行是这样的:
// In Sword constructor
m_entity.addComponent<Touchable>(&Sword::startTouch);
addComponent<>() 方法如下所示(省略不相关内容):
template<class T, class... Params)
T& addComponent(Entity& entity, Params&&... params)
{
// ...
// Retrieves the next free memory portion
T* t = Pooler<T>::instance().getNext();
// Constructs the new T - this is where MSVC points when the error happens
t = new(t) T(std::forward<Params>(params)...);
// ...
}
最后,Touchable 类如下所示:
class Touchable : public Tecs::Component
{
public:
Touchable(void(*touchFunc)(Tecs::Entity&))
: m_touchFunc(touchFunc)
{
}
void startTouch(Tecs::Entity& other)
{
(*m_touchFunc)(other);
}
private:
void(*m_touchFunc)(Tecs::Entity&);
};
这里问题的原因可能是什么?
它是成员函数指针,而不是函数指针。所以你也应该传递对象。您可以为此使用 std::bind
,在可触摸中使用 std::function
,而不是原始函数指针。
m_entity.addComponent<Touchable>
(
std::bind(&Sword::startTouch, std::ref(sword_object))
);
相关文章:
- C++:使用运算符 = 调用多参数构造函数
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 好奇的混合与可变参数构造函数
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 在可变参数构造函数中初始化常量数组
- C++ 显式多参数构造函数歧义
- 零一参数构造函数
- 可变参数构造函数中的 SFINAE
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 可变参数类模板和可变参数构造函数
- 确保模板参数类型与其可变参数构造函数的类型匹配
- C++默认参数构造函数与内联初始化优先级
- 如何在 c++ 中将包含复制构造函数的类的参数构造函数称为私有?
- 自动存储中没有无参数构造函数的类对象和异常
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 如何在C++中调用无参数构造函数
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- 可变参数构造函数优先于用户提供的移动构造函数,除非默认
- 如何从可变参数构造函数参数构造任何对象?