Как использовать указатель на функцию в качестве аргумента конструктора для шаблонного класса?

0

Я пытаюсь передать указатель функции в качестве аргумента для объекта, который создается с использованием шаблонной функции, но я получаю эту ошибку, когда я пытаюсь это сделать:

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&);
};

Что может быть причиной проблемы здесь?

  • 0
    Вы не предоставляете Entity в качестве первого аргумента в вызове addComponent . Кроме того, указатель функции является функцией-членом, но Touchable конструктор ожидает нормальный указатель функции. (Они не являются взаимозаменяемыми.)
  • 0
    @leemes Извините, я пропустил кусок кода там. Entity вызывает метод addComponent другого класса и использует себя в качестве аргумента.
Теги:
templates
function-pointers

1 ответ

1
Лучший ответ

Это указатель функции-члена, а не указатель на функцию. Таким образом, вы должны передать объект тоже. Вы можете использовать std::bind для этого, а в Touchable - использовать std::function, вместо необработанного указателя функции.

m_entity.addComponent<Touchable>
(
   std::bind(&Sword::startTouch, std::ref(sword_object))
);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню