У меня есть эта карта: map<IEvent, EventHandler, IEventCompare>
Где EventHandler
определяется как typedef void (*EventHandler)(IEvent);
IEvent
- это класс, описывающий общее событие.
Теперь я хочу добавить к этой карте функция, которая получает CreationEvent
, класс, который наследует IEvent
. Функция определяется так:
void onCreate(CreationEvent);
Но когда я пытаюсь добавить ее на карту, я получаю ошибку компиляции
E0167 argument of type "void (Engine::IObject::*)(Engine::CreationEvent)" is incompatible with parameter of type "Engine::EventHandler"
И если я пытаюсь чтобы явно преобразовать его в EventHandler
: E0171 invalid type conversion
Я могу объявить onCreate
с IEvent
, но я бы хотел избежать этого, так как это потребует от меня принятия типа события, и это не очень хорошо определено.
Есть ли способ сделать то, что я пытаюсь?
IEvent:
/**
* Represents an Event, such as collision between 2 objects or click on an object.
*/
class IEvent
{
public:
IEvent(string name) { this->name = name; };
/**
* Copy constructor.
*/
IEvent(const IEvent& other) { this->name = other.name;};
string getName() const { return this->name; };
protected:
string name;
};
CreationEvent:
class CreationEvent : public IEvent
{
public:
CreationEvent();
std::chrono::time_point<std::chrono::system_clock> getCreateTime() const;
private:
std::chrono::time_point<std::chrono::system_clock> creationTime; /**< The creation time of this event.*/
};
Примечания : Все внутри пространства имен Engine
, а карта объявлена внутри IObject
.