Qt QList<std::unique_ptr<Contact>> 的问题

QList<std::unique<Concat>> m_contacts;
m_contacts.emplaceBack(new Contact("", ""));
m_contacts.emplaceBack(new Contact("", ""));
m_contacts.emplaceBack(new Contact("", ""));
m_contacts.emplaceBack(new Contact("", ""));

第二行的 emplaceBack() 报错
原因如下:

在给定的代码中,第二行 m_contacts.emplaceBack(); 报错的原因是 std::unique_ptr 对象不能直接通过 emplace_back() 函数插入到 QList 容器中。
std::unique_ptr 是一个独占所有权的智能指针,它不支持拷贝操作,只能通过移动语义来转移所有权。而 QList 是一个基于值语义的容器,要求存储的元素类型必须支持拷贝构造和拷贝赋值操作。
解决此问题的一种方法是将 std::unique_ptr 包装在一个额外的类中,该类支持拷贝操作,并将该类的对象存储在 QList 中。例如,可以创建一个自定义的包装类 UniqueConcatWrapper,如下所示:

struct UniqueConcatWrapper {
    QSharedPointer<Contact> ptr;
    UniqueConcatWrapper(QSharedPointer<Contact> ptr) : ptr(ptr) {}
};

class ContactView : public QListView {
    QList<UniqueConcatWrapper> m_contacts;
};

m_contacts.emplace_back(QSharedPointer<Contact>(new Contact("", "")));
m_contacts.emplace_back(QSharedPointer<Contact>(new Contact("", "")));
m_contacts.emplace_back(QSharedPointer<Contact>(new Contact("", "")));
m_contacts.emplace_back(QSharedPointer<Contact>(new Contact("", "")));
m_contacts.emplace_back(QSharedPointer<Contact>(new Contact("", "")));

你可能感兴趣的:(C/C++系列,Bug,C++,智能指针错误,unique_ptr)