关于使用 Std::List 作为 Class 成员变量的奇怪错误
Strange Error regarding using Std::List as a Class Member Variable
我正在尝试用 C++ 实现事件处理系统,但遇到了 std::list 的编译器错误,我无法弄清楚原因。
有一个 EventManager class,其作用是管理和触发事件。有一个列表存储要处理的事件。
如果将 std::list 声明为 class 成员,则会出错。而如果列表被声明为局部方法变量,则没有错误。
class 是这样的:
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;
}
从上面的代码中,编译器在点符号下划线并得到消息 "No instance of overloaded function std::list<.....> matches the argument list and object (the object has type qualifiers that prevent a match. Argument types are (const IEventPtr). Object type is const EventManager::EventQueue"
编译时,编译器会显示错误:
std::list<....>::push_back。 2 重载没有 'this' 指针
的合法转换
导致此错误的原因是什么以及如何解决?
方法 EventManager::VQueueEvent 被标记为 const。这意味着它不能修改 class 个成员。
但是push_back方法显然需要修改eventList成员的内容,所以报错
删除 const 限定符,应该没问题。
您无法 push_back
到 class 成员,因为您将成员函数声明为 const
,这意味着您无法修改 class 和它的任何成员。
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 */;
我正在尝试用 C++ 实现事件处理系统,但遇到了 std::list 的编译器错误,我无法弄清楚原因。
有一个 EventManager class,其作用是管理和触发事件。有一个列表存储要处理的事件。
如果将 std::list 声明为 class 成员,则会出错。而如果列表被声明为局部方法变量,则没有错误。
class 是这样的:
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;
}
从上面的代码中,编译器在点符号下划线并得到消息 "No instance of overloaded function std::list<.....> matches the argument list and object (the object has type qualifiers that prevent a match. Argument types are (const IEventPtr). Object type is const EventManager::EventQueue"
编译时,编译器会显示错误:
std::list<....>::push_back。 2 重载没有 'this' 指针
的合法转换导致此错误的原因是什么以及如何解决?
方法 EventManager::VQueueEvent 被标记为 const。这意味着它不能修改 class 个成员。
但是push_back方法显然需要修改eventList成员的内容,所以报错
删除 const 限定符,应该没问题。
您无法 push_back
到 class 成员,因为您将成员函数声明为 const
,这意味着您无法修改 class 和它的任何成员。
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 */;