C++动态初始化quadtree::Vector2类对象[][2]二维数组编译报错问题
错误原因
- 赋值语法不合法:
new表达式返回的是右值,不能作为赋值运算符的左操作数,你写的new T[N][2] = { ... }链式赋值本身不符合C++语法要求,这也是你看到lvalue required as left operand of assignment报错的直接原因。 - 类型不匹配:
new quadtree::Vector2<int>[4][2]返回的是quadtree::Vector2<int> (*)[2]类型(指向长度为2的Vector2数组的指针),而你定义的idle是quadtree::Vector2<int> *[2]类型(存放两个Vector2指针的数组),二者类型完全不兼容。 - 初始化规则限制: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
相关产品推荐
相关产品推荐

