Я пытаюсь реализовать систему обработки событий на C ++ и обнаружил ошибку компилятора для std :: list, и я не могу понять, почему.
Существует класс EventManager, роль которого - управлять событиями и запускать их. Есть список, в котором хранятся события для обработки.
Если std :: list объявлен как член класса, возникает ошибка. Тогда как если список объявлен как переменная локального метода, ошибки нет.
Класс выглядит так:
class EventManager
{
//Queue for events. IEventPtr is a typedef of shared_ptr to an
//Events class
typedef std::list<IEventPtr> EventQueue;
EventQueue m_eventQueue;
virtual bool VQueueEvent(const IEventPtr& pEvent) const;
}
Определение метода VQueueEvent:
bool EventManager::VQueueEvent(const IEventPtr& pEvent) const
{
//compiler highlighted an error for a class member list
m_eventQueue.push_back(pEvent);
//a locally declared list works. No compiler error
std::list<IEventPtr> eventList;
eventList.push_back(pEvent);
return true;
}
В приведенном выше коде компилятор подчеркнул точечную нотацию и получил сообщение «Ни один экземпляр перегруженной функции std :: list‹ .....> не соответствует списку аргументов и объекту (объект имеет квалификаторы типа, предотвращающие совпадение. Аргумент типы (const IEventPtr). Тип объекта - const EventManager :: EventQueue "
При компиляции компилятор покажет ошибку:
std :: list ‹....> :: push_back. 2 перегрузки не имеют законного преобразования для указателя this
Что вызывает эту ошибку и как ее решить?
const
. - person songyuanyao   schedule 15.04.2018const
, это гарантирует, что функция-член не будет изменять элементы данных. Если его нужно изменить, это не должно бытьconst
. - person songyuanyao   schedule 15.04.2018