Странная ошибка при использовании Std :: List в качестве переменной-члена класса

Я пытаюсь реализовать систему обработки событий на 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

Что вызывает эту ошибку и как ее решить?


person Clement    schedule 15.04.2018    source источник
comment
Вы не можете изменять элементы данных в функции-члене const.   -  person songyuanyao    schedule 15.04.2018
comment
Спасибо. Я удалил константу, и ошибка компилятора исчезла. Означает ли это, что константные методы не могут добавлять или удалять элементы из структур данных, которые являются членами класса?   -  person Clement    schedule 15.04.2018
comment
Да, это то, что означает const, это гарантирует, что функция-член не будет изменять элементы данных. Если его нужно изменить, это не должно быть const.   -  person songyuanyao    schedule 15.04.2018


Ответы (2)


Метод EventManager :: VQueueEvent помечен как const. Это означает, что он не может изменять членов класса.

Однако методу push_back явно необходимо изменить содержимое элемента eventList и, следовательно, ошибку.

Удалите квалификатор const, и все будет в порядке.

person Sergio Monteleone    schedule 15.04.2018

Вы не смогли push_back подключиться к члену класса, потому что вы объявили функцию-член как const, что означает, что вы не можете изменять класс и любой из его членов.

Определение метода VQueueEvent должно быть таким:

bool EventManager::VQueueEvent(const IEventPtr& pEvent) /* const */
{
    // Now this should work fine
    m_eventQueue.push_back(pEvent);

    return true;
}

и такое объявление:

virtual bool VQueueEvent(const IEventPtr& pEvent) /* const */;
person Mohit    schedule 15.04.2018