作者:奉召开博_745 | 来源:互联网 | 2022-12-09 17:37
我正在尝试对包含const对象的智能指针的对向量进行排序.我只是想根据第一个对象进行排序.下面你看到(我的许多尝试之一)代码应该这样做,以及错误的摘录.
编译器抱怨lambda参数.我试图使参数const,非const,引用,rvalue-references无效.请帮忙?
std::pair > a;
auto uniq = std::make_unique("hurz");
a = std::make_pair(1,std::move(uniq));
std::pair > b;
uniq = std::make_unique("hurz");
b = std::make_pair(2,std::move(uniq));
std::vector > > vec;
vec.push_back(std::move(a));
vec.push_back(std::move(b));
std::sort(std::make_move_iterator(vec.begin()),
std::make_move_iterator(vec.end()),
[]
(const std::pair >& i1,
const std::pair >& i2)
{ return i1.first > i2.first;});
错误消息没有帮助我:
error: no matching function for call to
'swap(std::move_iterator<__gnu_cxx::__normal_iterator > >*, std::vector > > > > >::value_type,
std::move_iterator<__gnu_cxx::__normal_iterator > >*, std::vector > > > > >::value_type)' swap(*__a,
*__b);
candidates are:
/usr/include/c++/4.9/bits/move.h:166:5: note: void std::swap(_Tp&, _Tp&)
[with _Tp = std::pair > >]
plus many more errors in the same vein
NathanOliver..
7
这里的问题是使用std::make_move_iterator
.当你这样做时,你将迭代器转换成move_iterator
's',这意味着当你取消引用它们时,你会获得一个T&&
,而不是T&
像普通迭代器那样.
std::swap
,在你的实现中使用std::sort
只接受左值引用,因此它不能绑定到解引用的迭代器.如果你使用
std::sort(vec.begin(),
vec.end(),
[]
(const std::pair >& i1,
const std::pair >& i2)
{ return i1.first > i2.first;});
相反,你将有左值std::swap
来绑定,并将std::swap
只适用于移动类型
1> NathanOliver..:
这里的问题是使用std::make_move_iterator
.当你这样做时,你将迭代器转换成move_iterator
's',这意味着当你取消引用它们时,你会获得一个T&&
,而不是T&
像普通迭代器那样.
std::swap
,在你的实现中使用std::sort
只接受左值引用,因此它不能绑定到解引用的迭代器.如果你使用
std::sort(vec.begin(),
vec.end(),
[]
(const std::pair >& i1,
const std::pair >& i2)
{ return i1.first > i2.first;});
相反,你将有左值std::swap
来绑定,并将std::swap
只适用于移动类型