Da *_*nan 6 c++ sorting vector unique-ptr c++11
我声明了一个向量如下:vector<unique_ptr<Worker>> Workers.Worker是一个带有私有字段的基类,name它有两个派生类:Builder和Driver.
我添加到Workers的矢量对象Builder和Driver,然后我想在矢量排序,name使用#include <algorithm>这样的:
sort(Workers.begin(), Workers.end(), cmp_by_name);
bool cmp_by_name(const Worker &a, const Worker &b)
{
return a.getName() < b.getName();
}
Run Code Online (Sandbox Code Playgroud)
但VS编译器说:
错误1错误C2664:'bool(const Worker&,const Worker&)':无法将参数2从'std :: unique_ptr>'转换为'const Worker&'c:\ program files(x86)\ microsoft visual studio 12.0\vc\include\algorithm 3071 1 App
我该如何解决这个错误?
感谢@NathanOliver,@ Rabbid76和这个问题,我把我编辑cmp_by_name成这个表格:
struct cmp_by_name
{
inline bool operator()(const unique_ptr<Worker>& a, const unique_ptr<Worker>& b)
{
return a->getName() < b->getName();
}
};
Run Code Online (Sandbox Code Playgroud)
我将sort函数调用如下:
sort(Workers.begin(), Workers.end(), cmp_by_name());
Run Code Online (Sandbox Code Playgroud)
Nat*_*ica 13
使用的比较函数std::sort需要采用以下形式:
bool cmp(const Type1 &a, const Type2 &b);
Run Code Online (Sandbox Code Playgroud)
这里的类型Type1和Type2必须是这样的迭代器可提领,然后隐式转换为两者.
在你的情况下,解除引用Workers.begin()会给你一个unique_ptr<Worker>不是Worker.您需要更改比较功能才能获得const unique_ptr<Worker>&.
在这种情况下,它会看起来像:
bool cmp_by_name(const std::unique_ptr<Worker>& a, const std::unique_ptr<Worker>& b)
{
return a->getName() < b->getName();
}
Run Code Online (Sandbox Code Playgroud)
你的数据类型std::vector<std::unique_ptr<Worker>>是std::unique_ptr<Worker>,所以你的比较函数必须如下所示:
bool cmp_by_name(const std::unique_ptr<Worker> &a, const std::unique_ptr<Worker> &b)
{
return a->getName() < b->getName();
}
Run Code Online (Sandbox Code Playgroud)
比较函数需要参数,以便std::vector可以将对象转换为它们.