c++ - 当我将元素推到向量上时出错
问题描述
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
解决方案
您不能拥有my_t
对象的向量,因为my_t
该类包含std::mutex
es:
std::mutex bmtx;
std::mutex amtx;
互斥体有一个已删除的复制构造函数。没有复制构造互斥锁这样的事情。
由于您的my_t
类也没有复制构造函数,因此这也会自动删除my_t
的复制构造函数。
std::vector
的值类至少必须有一个复制构造函数和一个赋值运算符。这是因为向量必须能够重新分配其内容,以适应其增长。这意味着向量中的元素必须是可复制/可分配的。
如果你为你的my_t
类显式地实现了一个复制构造函数和一个赋值运算符,你就可以用它们来创建一个向量。但是你需要弄清楚复制构造和分配给你的my_t
班级意味着什么......
对于您的类,您最多可以做的是拥有一个指向my_t
实例的指针向量。也许使用std::unique_ptr
or std::shared_ptr
。
推荐阅读
- javascript - 只删除一个数组中的最小值。JS
- swift - 使用 SwiftUI ForEach 从 NSOrderedSet 获取字符串值
- r - 将多输出函数应用于R中的向量
- c - 基于链表的函数中的分段错误
- c++ - C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- javascript - IE 11 上的 InvalidCharacterError
- python - python中的二维矩阵值更新
- javascript - 如何向 p 标签添加一些类?
- regex - 使用正则表达式检查自定义字段是否包含 h2 标题
- angular - microsoft graph 发出无效令牌