You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++动态初始化quadtree::Vector2类对象[][2]二维数组编译报错问题

错误原因

  1. 赋值语法不合法:new表达式返回的是右值,不能作为赋值运算符的左操作数,你写的new T[N][2] = { ... }链式赋值本身不符合C++语法要求,这也是你看到lvalue required as left operand of assignment报错的直接原因。
  2. 类型不匹配:new quadtree::Vector2<int>[4][2]返回的是quadtree::Vector2<int> (*)[2]类型(指向长度为2的Vector2数组的指针),而你定义的idle是quadtree::Vector2<int> *[2]类型(存放两个Vector2指针的数组),二者类型完全不兼容。
  3. 初始化规则限制:C++中动态分配的二维数组不支持直接用花括号初始化列表整体赋值,只有聚合类型的一维动态数组支持该操作。

解决方案

方案1:保留裸指针实现(适配你原有map设计)

如果要沿用你现有的std::map<int, quadtree::Vector2<int> *[2]>设计,首先需要调整变量类型和初始化逻辑:

// 分配4行2列的二维数组,arr类型为quadtree::Vector2<int> (*)[2]
auto arr = new quadtree::Vector2<int>[4][2];
// 手动初始化每个元素
arr[0][0] = quadtree::Vector2<int>(48*0, 48*0);
arr[0][1] = quadtree::Vector2<int>(48*1, 48*1);
arr[1][0] = quadtree::Vector2<int>(48*1, 48*0);
arr[1][1] = quadtree::Vector2<int>(48*2, 48*1);
arr[2][0] = quadtree::Vector2<int>(48*2, 48*0);
arr[2][1] = quadtree::Vector2<int>(48*3, 48*1);
arr[3][0] = quadtree::Vector2<int>(48*3, 48*0);
arr[3][1] = quadtree::Vector2<int>(48*4, 48*1);

// 构造要存入map的指针对
quadtree::Vector2<int>* idle[2];
idle[0] = &arr[0][0]; // 可按需调整指针指向逻辑
idle[1] = &arr[0][1];
// 存入map
animations[动画枚举值][0] = idle[0];
animations[动画枚举值][1] = idle[1];

使用该方案需要注意:动态分配的数组使用结束后需要调用delete[] arr释放内存,避免内存泄漏。

方案2:现代C++实现(更安全,推荐)

直接用标准库容器替代裸指针,无需手动管理内存,也不会遇到类型匹配、初始化限制问题:
首先调整map的类型定义:

#include <vector>
#include <map>
#include <array>

std::map<int, std::vector<std::array<quadtree::Vector2<int>, 2>>> animations;

初始化逻辑非常简单,直接支持花括号列表赋值:

std::vector<std::array<quadtree::Vector2<int>, 2>> idle = {
    {{48*0, 48*0}, {48*1, 48*1}},
    {{48*1, 48*0}, {48*2, 48*1}},
    {{48*2, 48*0}, {48*3, 48*1}},
    {{48*3, 48*0}, {48*4, 48*1}},
};
// 直接存入map即可
animations[动画枚举值] = std::move(idle);

内容的提问来源于stack exchange,提问作者Druid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:54:02