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

如何初始化存储智能指针的std::array?

解决二维std::array搭配std::unique_ptr的初始化问题

嘿,我来帮你搞定这个问题~

首先,你遇到的报错根源是**std::make_unique的用法错了**,跟std::array和智能指针的搭配没关系——这俩完全可以一起用,这点你放心!

错误原因拆解

你写的std::make_unique<Spot>(new Spot())是典型的误用:std::make_unique的设计目的就是帮你自动完成内存分配(替代手动new),它接收的参数是目标类构造函数的参数,而不是一个已经用new创建好的指针。你现在传了new Spot()(一个Spot*类型),但Spot的构造函数应该是期望const Spot&(拷贝构造)或者其他合法参数,所以编译器才会报错说“无法将Spot*转换为const Spot&”。

正确的初始化代码

直接去掉多余的new,调用std::make_unique<Spot>()即可。如果Spot的构造函数需要参数(比如接收行列坐标),直接把参数传给make_unique就行:

static const int WIDTH = 7;
static const int HEIGHT = 6;
std::array<std::array<std::unique_ptr<Spot>, WIDTH>, HEIGHT> field;

// 基础版初始化(无参构造)
for (int i = 0; i < HEIGHT; ++i) {
    for (int j = 0; j < WIDTH; ++j) {
        field[i][j] = std::make_unique<Spot>();
        // 如果Spot有带参构造,比如Spot(int row, int col),这么写:
        // field[i][j] = std::make_unique<Spot>(i, j);
    }
}

更简洁的写法(C++20+)

如果你的编译器支持C++20或更高版本,还可以用范围for循环简化代码,可读性更好:

for (auto& row : field) {
    for (auto& spot_ptr : row) {
        spot_ptr = std::make_unique<Spot>();
    }
}

关于std::array和智能指针的兼容性

完全没问题!std::array是固定大小的容器,只要元素类型支持移动/拷贝操作(std::unique_ptr支持移动),就可以作为它的元素。你之前的困惑只是因为搜索结果没覆盖到std::array嵌套+unique_ptr的场景,但这种用法是完全合法且常用的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:04:20