C++中unordered_set能否用自定义类指针作键?LNK2001错误排查
解决UE4中C++静态成员变量的LNK2001未解析外部符号错误
错误原因
你在头文件中仅声明了Point类的静态成员变量CachedPoint和CachedNum,但未在.cpp文件中为它们分配实际内存空间。C++规定,静态成员变量必须在类的外部进行定义,否则链接器无法找到对应的符号实体,从而抛出LNK2001错误。
解决步骤
- 创建或打开
Point.cpp文件(若尚未存在) - 在文件中添加静态成员变量的定义,以及类成员函数的实现:
#include "Point.h" namespace Grid { // 为静态成员变量分配内存 size_t Point::CachedNum = 0; std::unordered_set<Point*, Point::PointHash, Point::PointEqual> Point::CachedPoint; // 构造函数实现 Point::Point(float X, float Y, float Z) : X(X), Y(Y), Z(Z) {} // CreatePoint 缓存逻辑实现 Point* Point::CreatePoint(float X, float Y, float Z) { // 临时对象用于查找缓存 Point temp(X, Y, Z); auto iter = CachedPoint.find(&temp); if (iter != CachedPoint.end()) { return *iter; } // 缓存不存在则创建新实例并存入缓存 Point* newPoint = new Point(X, Y, Z); CachedPoint.insert(newPoint); CachedNum++; return newPoint; } // ClearCache 清理缓存实现 void Point::ClearCache() { for (Point* point : CachedPoint) { delete point; } CachedPoint.clear(); CachedNum = 0; } }
补充说明
- 静态成员变量的定义格式为:
类型 类名::成员名 = 初始值;,容器类可依赖默认构造,内置类型建议显式初始化 - 必须确保所有类成员函数(构造函数、
CreatePoint、ClearCache)都在.cpp文件中有实现,否则会触发其他未解析符号错误
内容的提问来源于stack exchange,提问作者Krieg0726
相关产品推荐
相关产品推荐

