C++类静态成员m_eventQueue触发undefined reference链接错误如何解决
问题成因
这是C++静态成员变量的标准语法规则导致的链接错误:
类内部声明的非inline静态成员变量仅属于声明,不会实际分配内存空间,必须在类的外部、全局作用域单独提供一次定义,链接器才能找到对应的符号地址。你在commonQueue类中声明的m_queue和m_eventQueue两个静态成员都只做了类内声明,没有提供外部定义,因此访问时触发undefined reference报错。
而非静态成员变量属于每个类实例的专属内存,创建实例时自动分配空间,因此去掉static修饰后编译正常。
解决方案
方案1:兼容C++11及更早版本
在源文件inher3.cpp的全局区域(#include语句之后,函数定义之前)添加两个静态成员的定义代码:
// 全局作用域下添加 std::queue<EventBasePtr> commonQueue::m_queue; EventQueuePtr commonQueue::m_eventQueue;
如果需要指定初始值,可以直接在此处赋值,例如:
EventQueuePtr commonQueue::m_eventQueue = nullptr;
注意:不要将上述定义代码放在头文件中,否则多个源文件引用头文件时会触发重复定义错误。
方案2:C++17及以上版本可用
直接修改头文件中commonQueue类的静态成员声明,添加inline关键字,即可省略类外的单独定义步骤:
class commonQueue { public: int *a; inline static std::queue<EventBasePtr> m_queue; inline static EventQueuePtr m_eventQueue; };
编译时指定C++17及以上标准即可:
g++ --std=c++17 inher3.cpp
额外注意
你代码中的EventQueue类仅声明了析构函数,没有提供实现,静态成员问题修复后仍然会触发链接错误,可以选择删掉析构函数的声明,或者在源文件中添加实现:
EventQueue::~EventQueue() = default;
内容的提问来源于stack exchange,提问作者badri
相关产品推荐
相关产品推荐

