C++:自定义数据类型向量错误的队列
C++: Queue of custom data type vector error
我正在使用自定义类型向量的线程安全队列。 它显示以下错误。我不确定我在这里错过了什么。
错误 C2664 'std::vector>::vector(std::vector<_Ty,std::allocator<_Ty>> &&,const _Alloc &( noexcept((':无法将参数 2 从 'int' 转换为 'const std::allocator<_Ty> 和 '。
#include <mutex>
#include <condition_variable>
#include <queue>
#include <memory>
#include <iostream>
#include <thread>
template<typename T>
class threadsafe_queue
{
private:
mutable std::mutex mut;
std::queue<T> data_queue;
std::condition_variable data_cond;
public:
threadsafe_queue()
{}
threadsafe_queue(threadsafe_queue const& other)
{
std::lock_guard<std::mutex> lk(other.mut);
data_queue = other.data_queue;
}
void push(T new_value)
{
std::lock_guard<std::mutex> lk(mut);
data_queue.push(new_value);
data_cond.notify_one();
}
void wait_and_pop(T& value)
{
std::unique_lock<std::mutex> lk(mut);
data_cond.wait(lk, [this] {return !data_queue.empty(); });
value = data_queue.front();
data_queue.pop();
}
std::shared_ptr<T> wait_and_pop()
{
std::unique_lock<std::mutex> lk(mut);
data_cond.wait(lk, [this] {return !data_queue.empty(); });
std::shared_ptr<T> res(std::make_shared<T>(data_queue.front()));
data_queue.pop();
return res;
}
bool try_pop(T& value)
{
std::lock_guard<std::mutex> lk(mut);
if (data_queue.empty)
return false;
value = data_queue.front();
data_queue.pop();
}
std::shared_ptr<T> try_pop()
{
std::lock_guard<std::mutex> lk(mut);
if (data_queue.empty())
return std::shared_ptr<T>();
std::shared_ptr<T> res(std::make_shared<T>(data_queue.front()));
data_queue.pop();
return res;
}
bool empty() const
{
std::lock_guard<std::mutex> lk(mut);
return data_queue.empty();
}
};
class cp_data
{
public:
int num;
double time;
cp_data(int a, double b)
{
num = a;
time = b;
}
};
int main() {
std::vector<cp_data> data(1,2);
threadsafe_queue<std::vector<cp_data>> temp_queue;
temp_queue.push(data);
system("pause");
}
vector 没有构造函数将其参数转发到它所持有的数据类型以创建单个元素。
但是,您可以使用std::initializer_list
构造函数通过执行以下操作传入一个对象(如果需要,也可以传入多个对象(:
改变
std::vector<cp_data> data(1,2);
自
std::vector<cp_data> data{{1,2}};
或者,您可以在语法上更明确地创建cp_data
对象:
std::vector<cp_data> data{cp_data(1,2)};
{1,2}
创建cp_data
对象,然后通过外部{...}
创建的std::initializater_list
将对象传递给向量的构造函数
直播: https://godbolt.org/g/s2AwJU
作为旁注,vector::emplace_back
确实像您的代码尝试构造对象一样工作 - 它会将您的参数转发给cp_data
的构造函数,以便创建一个对象以存储在向量中。
相关文章:
- boost::进程间消息队列引发错误
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 在C++中创建队列 - 什么是 malloc 错误?
- C++数组队列实现方法错误
- 使用MPI_Gather会导致无法附加到引导队列错误
- 使用 <list> (错误 C2760) 打印队列的元素
- 使用 std::forward_list 返回错误的队列实现
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 获取错误:之前在此处声明的布尔队列的编辑<T>
- C++:自定义数据类型向量错误的队列
- 为什么STL优先级队列错误地分配了我的类对象
- 前缀表示法 C++,分段错误(堆栈和队列)
- 线程安全队列出现分段错误
- 队列验证层错误:队列族索引在 pCreateInfo->pQueueCreateInfos 数组中不是唯一的
- 交换优先级队列时尝试引用已删除的函数错误
- 为什么我的简单C++程序使用队列和 fstream 错误到无效指针
- 尝试编译队列时static_initialization_and_destruction错误
- 队列类的取消排队方法"Aborted (core dumped)"错误
- 在.c文件接收函数中使用Linux中的MSGGET创建消息队列未实现错误
- 尝试使用堆栈创建队列.为什么我会遇到int转换错误的空白