Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将每个元素排列在唯一指针向量中?(C+;+;)_C++_C++11_Templates_Queue_Smart Pointers - Fatal编程技术网

C++ 如何将每个元素排列在唯一指针向量中?(C+;+;)

C++ 如何将每个元素排列在唯一指针向量中?(C+;+;),c++,c++11,templates,queue,smart-pointers,C++,C++11,Templates,Queue,Smart Pointers,我试图将唯一指针向量的每个元素推入队列,但由于某些原因,我的代码无法编译 我得到的错误是:error:使用删除的函数'std::unique\u ptr::unique\u ptr(const std::unique\u ptr&)[with{u Tp=Foo;\u Dp=std::default\u delete] 由于我正在将唯一指针向量移动到排队函数中,并再次将每个元素移动到队列,因此我不确定这为什么不起作用 #include <memory> #include <vec

我试图将唯一指针向量的每个元素推入队列,但由于某些原因,我的代码无法编译

我得到的错误是:
error:使用删除的函数'std::unique\u ptr::unique\u ptr(const std::unique\u ptr&)[with{u Tp=Foo;\u Dp=std::default\u delete]

由于我正在将唯一指针向量移动到
排队
函数中,并再次将每个元素移动到
队列
,因此我不确定这为什么不起作用

#include <memory>
#include <vector>
#include <queue>

class Foo {};

class Bar {
  
 public:
  template<typename Container>
  void enqueue(Container c) {
    for (const auto &e : c) {
      queue_.push(std::move(e));
    }
  };
  
 private:
  std::queue<std::unique_ptr<Foo>> queue_;
};

int main() {

  Bar bar;

  std::vector<std::unique_ptr<Foo>> c;
  c.push_back(std::make_unique<Foo>());

  bar.enqueue(std::move(c)); // this line is causing problem

};
#包括
#包括
#包括
类Foo{};
分类栏{
公众:
模板
无效排队(容器c){
用于(常数自动和电气:c){
队列推送(std::move(e));
}
};
私人:
std::队列;
};
int main(){
酒吧;
std::向量c;
c、 向后推(std::make_unique());
bar.enqueue(std::move(c));//此行导致了问题
};

您有一个额外的
常量
,可以避免移动,而是进行(删除的)复制:

将其移除并使用:

for (auto &e : c) {
    queue_.push(std::move(e));
}

您有一个额外的
常量
,可以避免移动,而是进行(删除的)复制:

将其移除并使用:

for (auto &e : c) {
    queue_.push(std::move(e));
}

const auto&e
std::move(e)
:moving const元素确实复制了…啊,谢谢。我不知道。
const auto&e
std::move(e)
:moving const元素会复制…啊,谢谢。我不知道。非常感谢@Jarod42。对于(auto&&e:c)可能更好
非常感谢@Jarod42。对于(auto&&e:c)可能更好