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

标签 c++ std stdlist

我试图在 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' 指针没有合法的转换

是什么导致了这个错误,如何解决?

最佳答案

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

但是push_back方法显然需要修改eventList成员的内容,所以报错。

去掉const限定符应该没问题。

关于c++ - 关于使用 Std::List 作为类成员变量的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49840209/

相关文章:

c++ - 左值与右值可疑

c++ - sscanf 保存到 vector

c++ - 当我们增加下面的类型转换指针时会发生什么?

c++ - 将容器存储在 boost::variant 中

包含列表的 c++ 映射

C++:非本地类型提升

c++ - 读取格式不正确的文件时应该抛出什么类型的 std::exception?

c++ - std::function 表达式不会产生接受 1 个参数的函数

C++ List 最多删除列表中的 end()-1 个元素

c++ - 使用列表列表时的内存泄漏