关于使用 Std::List 作为类成员变量的奇怪错误

Strange Error regarding using Std::List as a Class Member Variable

本文关键字:变量 成员 错误 Std 于使用 List      更新时间:2023-10-16

我正在尝试在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;
}

VQueEvent 方法的定义是:

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<....>::p ush_back. 2 重载没有合法转换"this"指针

导致此错误的原因以及如何解决?

方法EventManager::VQueueEvent标记为const。这意味着它不能修改类成员。

但是,push_back方法显然需要修改 eventList 成员的内容,从而修改错误。

删除常量限定符,它应该没问题。

您无法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 */;