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

时间:2018-04-15 08:58:35

标签: 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;
}

从上面的代码中,编译器为点符号加下划线并且有消息&#34;没有重载函数的实例std :: list&lt; .....&gt;匹配参数列表和对象(该对象具有阻止匹配的类型限定符。参数类型为(const IEventPtr)。对象类型为const EventManager :: EventQueue&#34;

编译时,编译器将显示错误:

的std ::列表&LT; ....&GT; ::的push_back。 2个超载没有法律转换,因为这个&#39;指针

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

由于您将成员函数声明为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 */;