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
相关产品推荐
相关产品推荐

