Я пытаюсь передать указатель функции в качестве аргумента для объекта, который создается с использованием шаблонной функции, но я получаю эту ошибку, когда я пытаюсь это сделать:
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
для этого, а в Touchable - использовать std::function
, вместо необработанного указателя функции.
m_entity.addComponent<Touchable>
(
std::bind(&Sword::startTouch, std::ref(sword_object))
);
Entity
в качестве первого аргумента в вызовеaddComponent
. Кроме того, указатель функции является функцией-членом, ноTouchable
конструктор ожидает нормальный указатель функции. (Они не являются взаимозаменяемыми.)Entity
вызывает методaddComponent
другого класса и использует себя в качестве аргумента.