【问题标题】:Using a vector of unique pointers to an <Employee> vector使用指向 <Employee> 向量的唯一指针向量
【发布时间】:2014-04-02 22:41:54
【问题描述】:

对于学校作业,我正在尝试使用指向 Employee 对象的唯一指针向量来访问 Employee 数据,但无法找出语法/编译器错误。谁能告诉我我做错了什么?必须以这种方式使用智能指针向量。

这是适用的代码:

// Create an Employee
Employee EmpRec;

// Assign value to a uniqueptr
unique_ptr<Employee> TempEmp;
*TempEmp = EmpRec;

// Create a vector of unique_ptr<Employee>
vector<unique_ptr<Employee>> EmpVect;

// Push the TempEmp pointer onto the vector
EmpVect.push_back(TempEmp);

// Iterate through vector, calling display function 
//that prints the values of various data inside the Employee object
for (size_t i = 0; i < EmpVect.size(); ++i){
    (EmpVect[i])->display(cout);
}

这就是我的 Display 函数的定义方式:

void display(std::ostream& cout) const{
    // print data members using cout <<
}

尝试编译时,出现以下错误:

d:\microsoft visual studio 12.0\vc\include\xmemory0(593): error C2280: 'std::unique_ptr>::unique_ptr(const std::unique_ptr<_ty>> & )' : 试图引用一个已删除的函数

【问题讨论】:

标签: c++ pointers vector ostream


【解决方案1】:

像这样调用push_back 会尝试将unique_ptr 复制到向量中。你不能复制unique_ptrs!相反,您需要将其移动到向量中:

EmpVect.push_back(std::move(TempEmp));

但是,您确实有另一个问题。您的unique_ptr 未初始化为指向任何特定分配的Employee,然后您尝试分配给该对象。这不好。相反,您应该动态分配 Employee 并将其传递给 unique_ptr 构造函数:

unique_ptr<Employee> TempEmp(new Employee());

或者最好使用std::make_unique 中的an implementation(将在C++14 中提供)。

【讨论】:

  • 你也可以使用 EmpVect.emplace_back( TempEmp )
  • @DaliborFrivaldsky 你可以吗?很确定你仍然需要std::move它。
  • 是的,你是对的,它需要是 EmpVect.emplace_back( std::move(TempEmp) )
猜你喜欢
  • 2011-08-04
  • 2013-07-19
  • 2017-11-10
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多