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

C++中list插入报错:无法将MyOtherClass<int>*转换为MyOtherClass<int>&&

解决list插入时的类型不匹配编译错误

嘿,我一眼就看出问题所在啦!你的nodes是list<MyOtherClass<int>>类型,这意味着这个列表存储的是**MyOtherClass<int>的实体对象**,但你现在尝试插入的是一个指向该对象的指针(MyOtherClass<int>*)——这俩类型完全不搭,编译器当然会抛出那个转换错误啦。

给你几个可行的解决方案,按需选择:

方案1:直接存储实体对象(最推荐,除非你有特殊需求)

既然列表定义的是存储对象,那咱就直接构造对象插入,别用new搞指针:

// 方式1:构造临时对象传入push_back
nodes.push_back(MyOtherClass<int>(size));
// 方式2:用emplace_back更高效,直接在容器内部构造对象,避免不必要的拷贝
nodes.emplace_back(size);

emplace_back会直接调用MyOtherClass<int>的构造函数在列表的内存空间里创建对象,比先构造临时对象再拷贝进去要高效不少。

方案2:修改列表类型为存储指针(适合多态场景)

如果你确实需要在列表里存指针(比如后续要用到多态,比如MyOtherClass有子类),那得先把列表的类型改成指针类型:

class MyList {
protected:
    // 把list的元素类型改成指针
    list<MyOtherClass<int>*> nodes;
    int size;
    // ...其他成员
};

// 这时候插入指针就没问题了
MyOtherClass<int>* temp = new MyOtherClass<int>(size);
nodes.push_back(temp);

⚠️ 注意:用裸指针的话,一定要记得在MyList的析构函数里手动释放每个指针指向的内存,不然会造成内存泄漏:

~MyList() {
    for (auto ptr : nodes) {
        delete ptr;
    }
}

更安全的指针方案:用智能指针

为了避免手动管理内存的麻烦,推荐用C++11及以后的智能指针,比如unique_ptr:

#include <memory> // 别忘了包含这个头文件

class MyList {
protected:
    list<unique_ptr<MyOtherClass<int>>> nodes;
    int size;
    // ...其他成员
};

// 插入的时候用make_unique创建智能指针
nodes.push_back(make_unique<MyOtherClass<int>>(size));

unique_ptr会自动在对象不再被使用时释放内存,完全不用你手动写delete,安全又省心。

总结一下:你之前的错误核心就是列表存储的类型和你插入的类型不匹配——一个是对象,一个是指针,调整其中一方的类型就能解决问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:37:03