如何在FSlotStructure类型TArray中查找结构索引 解决C2678报错
错误原因说明
你遇到的C2678报错核心是TArray<FSlotStructure>::Find()方法依赖类型的相等判断逻辑,而你自定义的FSlotStructure结构体没有实现合法的==运算符重载。TArray的Find方法内部会遍历数组,将每个元素和传入的查找目标做==比较,而UE的自定义USTRUCT默认不会生成相等判断逻辑,需要你手动实现,且必须支持常量实例调用,和报错提示里的const FSlotStructure左操作数要求匹配。
修复步骤
1. 给FSlotStructure添加==运算符重载
在FSlotStructure的结构体定义内添加如下代码,替换为你自己的相等判断逻辑即可:
bool operator==(const FSlotStructure& Other) const { // 示例:判断两个槽的道具ID、空槽状态一致即视为相等,可按实际需求修改 return ItemId == Other.ItemId && bIsEmpty == Other.bIsEmpty; }
注意函数末尾必须加
const修饰,否则常量实例调用时会无法匹配到该运算符,依然触发相同报错。
2. 优化现有代码逻辑
你当前写的CreateStack函数存在逻辑问题:遍历数组的同时调用Find+Insert会动态修改数组长度,大概率触发死循环,且遍历过程中已经可以直接判断槽位状态,不需要额外调用Find,参考优化实现:
void UInventoryComponent::CreateStack(FSlotStructure& ContentToAdd) { // 遍历查找空槽直接填充 for (int32 Index = 0; Index < Inventory.Num(); ++Index) { if (Inventory[Index].bIsEmpty) // 替换为你自己的空槽判断逻辑 { Inventory[Index] = ContentToAdd; return; } } // 无空槽时追加到数组末尾 Inventory.Add(ContentToAdd); }
内容的提问来源于stack exchange,提问作者neoluna
相关产品推荐
相关产品推荐

