使用消息
收到大量编译错误c:\mingw\include\c++\6.1.0\bits\predefined_ops.h:123:18: error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Deduction; _Dp = std::default_delete<Deduction>]'
{ return bool(_M_comp(*__it1, *__it2)); }
当我将自定义比较器传递给STL set_difference
函数时。
我的代码:
struct Value{
std::string ded_code;
float amount;
Value(std::string code, float amt):ded_code(code), amount(amt){}
};
struct Deduction{
std::string p_number;
std::vector<std::unique_ptr<Value>> values;
Deduction(string pnum, string code, float amt):p_number(pnum){
auto val = std::make_unique<Value>(code, amt);
values.emplace_back(move(val));
}
};
class compute{
public:
vector<unique_ptr<Deduction>> deductions;
void fillDeductions(){
// fill deductions
...
}
};
class CompareDiff{
public:
bool operator()(unique_ptr<Deduction>& ded1, unique_ptr<Deductions>& ded2){
rPtr1 = ded1.get();
rPtr2 = ded2.get();
return ( rPtr1->p_number < rPtr2->p_number);
}
};
...
int main(){
...
// fill two deduction vectors
Compute compA = Compute()
compA.fillDeductions()
Compute compB = Compute()
compB.fillDeductions()
vector<unique_ptr<Deduction>> diffs
set_difference(compA.begin(), compA.end(),
compB.begin(), compB.end(),
inserter(diffs, diffs.begin()), CompareDiff());
}
我在Windows 7机器上使用gcc 6.1.0。
我错过了什么?
问候。
PG
答案 0 :(得分:7)
std::unqiue_ptr
的主要特征是无法复制。这是设计的,名字告诉你了。
但是,CompareDiff
尝试按值获取其参数。这需要一份副本。相反,请选择std::unique_ptr<..> const&
- 无需复制。
答案 1 :(得分:6)
您仍然收到错误的原因:
std :: set_difference在内部复制:
将排序范围[first1,last1]中的元素(在排序范围[first2,last2]中找不到)复制到从d_first开始的范围。
http://en.cppreference.com/w/cpp/algorithm/set_difference
如果您希望编译代码,请改用std :: shared_ptr。
请记住,标准库是针对对象优化的,而不是针对指针的。如果使用指针,则必须自己进行所有权管理。
答案 2 :(得分:4)
你不能复制构建unique_ptr
,因为它是一个删除的函数,你可以移动唯一的指针来转移所有权,但是因为你想要一个函子来比较你需要传递的东西{{1} 1}}通过参考。
答案 3 :(得分:1)
使用unique_ptr<x>
表示某个函数承担x
的所有权。
使用shared_ptr<x>
表示某个功能是x
的部分所有者。
如果您确实要传递unique_ptr
并转让所有权,则应将move
智能指针放入函数参数中。
More notes on passing smart pointers,Herb Sutter在this CppCon talk中有一些好主意。