如何处理错误:在c++中使用删除函数'std::unique_ptr< _Tp,_Dp>

j7dteeu8  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(137)

我在HC类的remv()方法中遇到了find_if()问题。这个方法的目的是从vector humans中删除一个ptr,下面是我的代码:

class H {
protected:
    //string name = "null";
public:
    virtual string getName() = 0;
};

class P : public H {
    string name;
public:
    P() {}
    P(string n) : name(n) {}

    string getName() {return this->name;}
};

class HC {
public:
    vector< unique_ptr<H> > humans;
    void add(unique_ptr<H> h) { this->humans.push_back(move(h)); }
    void display() { for(auto& i: humans) cout << i->getName(); }
    void remv(){
        string s;
        cin >> s;
        auto it = find_if(humans.begin(), humans.end(), [&s](unique_ptr<H> h) {return h->getName() == s;}); 
        humans.erase(humans.begin());
    }
};

一旦find_if()被放入remv(),我会看到以下内容:

error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = H; _Dp = std::default_delete]’

你能解释一下我的代码有什么问题吗?我猜这与移动语义学有关

6tdlim6h

6tdlim6h1#

unique_ptr<H> h-它试图复制一个不可复制的对象。错误消息通知您已删除的复制构造函数。如果你不想复制和修改一个参数,你应该使用一个常量引用const unique_ptr<H>& h
其他有用的变化。virtual string getName() = 0;virtual string getName() const = 0;string getName()string getName() const override

相关问题