关于使用 Std::List 作为类成员变量的奇怪错误
Strange Error regarding using Std::List as a Class Member Variable
我正在尝试在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 */;
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++预处理会生成变量成员、资源库和映射
- 局部堆栈变量成员的返回值优化
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 如果派生类仅包含自动变量成员,是否有必要具有虚拟驱动器
- 线程安全性和静态变量/成员功能
- "static const char array"可以在 C 语言上包含变量成员吗
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 类中未声明变量成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- c++模板类静态const变量成员作为映射键给出未定义引用
- 在类中初始化结构变量成员会导致分割错误
- 在c++中建模变量成员类型
- 模板私有静态变量成员的未定义符号
- 不能访问公共静态变量成员
- 常量变量成员在C++有什么用?
- g++ 4.8.2坚持简单变量成员是数组