首页 > 解决方案 > 当我将元素推到向量上时出错

问题描述

is implicitly deleted because the default definition would be ill-formed当我想用 将元素添加到向量时,下面的代码出现错误,container.push_back(tmp);这是为什么呢?我的代码:

#include <vector>
#include <mutex>
class A {
    public:
    A(){}
    ~A(){}
};
class my_t {
    private:
        bool busy;
        bool alive;
        std::mutex bmtx;
        std::mutex amtx;
    public:
        my_t(){std::lock_guard<std::mutex>lock(bmtx);busy=false;}
        ~my_t(){}
        A* conn; 
        void take(void) {std::lock_guard<std::mutex>lock(bmtx);busy=true; }
        void give(void) {std::lock_guard<std::mutex>lock(bmtx);busy=false; }
        bool busy_get(void) {return busy;}
        void set_online(void){ std::lock_guard<std::mutex>lock(amtx); alive=true; }
        void set_OFFLINE(void) {std::lock_guard<std::mutex>lock(amtx); alive=false; }
        bool alive_get(void) {return alive;}

};

class app {
    private:
        std::vector<my_t> container;
    public: 
        app();
        ~app();
};
app::app() {
    my_t tmp;
    tmp.conn = new A();
    if (tmp.conn)
        tmp.set_online();
    container.push_back(tmp);


}
int main(void) {}

或在 Coliru 上:https ://coliru.stacked-crooked.com/a/11625c77383df80c

标签: c++classvectortypes

解决方案


您不能拥有my_t对象的向量,因为my_t该类包含std::mutexes:

 std::mutex bmtx;
 std::mutex amtx;

互斥体有一个已删除的复制构造函数。没有复制构造互斥锁这样的事情。

由于您的my_t类也没有复制构造函数,因此这也会自动删除my_t的复制构造函数。

std::vector的值类至少必须有一个复制构造函数和一个赋值运算符。这是因为向量必须能够重新分配其内容,以适应其增长。这意味着向量中的元素必须是可复制/可分配的。

如果你为你的my_t类显式地实现了一个复制构造函数和一个赋值运算符,你就可以用它们来创建一个向量。但是你需要弄清楚复制构造和分配给你的my_t班级意味着什么......

对于您的类,您最多可以做的是拥有一个指向my_t实例的指针向量。也许使用std::unique_ptror std::shared_ptr


推荐阅读