在我的项目中,我需要包含指向数据单元实例的智能指针的容器。我写的类(简单的例子):
template <typename T>
class Queue
{
public:
void push(const T & param)
{
m_deque.push_front(param);
}
private:
std::deque<T> m_deque;
};
比我想推的那个:
int main()
{
Queue< std::unique_ptr<DataBox> > queue;
std::unique_ptr<DataBox> d1(new DataBox(11));
queue.push(d1);
return 0;
}
VS2017 编译器说我不能这样做:
Error C2280 std::unique_ptr<DataBox,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
据我所知,错误的原因是试图复制 unique_ptr。但是,如果我将签名更改为:
void push(T && param) {...}
和函数调用
queue.push( std::move(d1) );
我又遇到了这个错误。所以问题是 - 我应该如何实现 push()
那会 move unique_ptr
排队?
最佳答案
您应该修改您的类以处理仅 move 类型:
template <typename T>
class Queue
{
public:
void push(const T & param)
{
m_deque.push_front(param);
}
void push(T&& param)
{
m_deque.push_front(std::move(param));
}
private:
std::deque<T> m_deque;
};
使用方法:
int main()
{
Queue< std::unique_ptr<DataBox> > queue;
std::unique_ptr<DataBox> d1(new DataBox(11));
queue.push(std::move(d1));
}
关于C++:如何将 unique_ptr 推送到双端队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51525025/