C++ 使用std::sort时禁止使用函子(inherrited)?
如果查看签名,则按值获取其比较对象: 您的对象被切片,您最终尝试实例化一个按值获取抽象类的函数,因此会出现所有错误 您需要做的是确保即使C++ 使用std::sort时禁止使用函子(inherrited)?,c++,sorting,stl,functor,C++,Sorting,Stl,Functor,如果查看签名,则按值获取其比较对象: 您的对象被切片,您最终尝试实例化一个按值获取抽象类的函数,因此会出现所有错误 您需要做的是确保即使sort按值进行比较,您也可以通过引用传递您的值。谢天谢地,有一个应用程序可以做到这一点!只需使用: 也就是说,你真的需要一个多态性比较?如果您只是将不同的比较函数对象传递到FilesList构造函数中,您应该更愿意将其作为函数模板: std::sort(this->begin(), this->end(), std::ref(fileSorter
sort
按值进行比较,您也可以通过引用传递您的值。谢天谢地,有一个应用程序可以做到这一点!只需使用:
也就是说,你真的需要一个多态性比较?如果您只是将不同的比较函数对象传递到
FilesList
构造函数中,您应该更愿意将其作为函数模板:
std::sort(this->begin(), this->end(), std::ref(fileSorter));
模板
文件列表(const std::string&dir、const std::string&f_regex、Sorter fileSorter){
// ...
std::sort(begin(),end(),fileSorter);//现在可以复制了
}
这样,您就可以直接转发用户传递的内容,避免虚拟分派。如果查看签名,则按值获取其比较对象: 您的对象被切片,您最终尝试实例化一个按值获取抽象类的函数,因此会出现所有错误 您需要做的是确保即使
sort
按值进行比较,您也可以通过引用传递您的值。谢天谢地,有一个应用程序可以做到这一点!只需使用:
也就是说,你真的需要一个多态性比较?如果您只是将不同的比较函数对象传递到
FilesList
构造函数中,您应该更愿意将其作为函数模板:
std::sort(this->begin(), this->end(), std::ref(fileSorter));
模板
文件列表(const std::string&dir、const std::string&f_regex、Sorter fileSorter){
// ...
std::sort(begin(),end(),fileSorter);//现在可以复制了
}
这样,您就可以直接转发用户传递的内容并避免虚拟分派。您的FileSorter参数默认为SortByExtension对象,而不是SortByName对象。由于您没有包括SortByExtension的源代码,我将首先检查SortByExtension的函数调用操作符的函数签名是否正确
template <class Sorter>
FilesList(const std::string& dir, const std::string& f_regex, Sorter fileSorter) {
// ...
std::sort(begin(), end(), fileSorter); // now copying is fine
}
如果基类和派生类函数签名之间存在任何差异,则派生类函数不会重写基类函数,派生类将被视为抽象类。您的FileSorter参数默认为SortByExtension对象,而不是SortByName对象。由于您没有包括SortByExtension的源代码,我将首先检查SortByExtension的函数调用操作符的函数签名是否正确
template <class Sorter>
FilesList(const std::string& dir, const std::string& f_regex, Sorter fileSorter) {
// ...
std::sort(begin(), end(), fileSorter); // now copying is fine
}
如果基类和派生类函数签名之间存在任何差异,则派生类函数将不会重写基类函数,并且派生类将被视为抽象类。由于未声明的
SortByExtension
,您的代码无法生成。抱歉@AmiTavory,我省略了SortByExtension
的声明以缩小问题的规模。对不起,有个错误。谢谢。STL中的大多数谓词都是通过副本传递的。你能摆脱你的虚拟界面,改用模板吗?@JaeJunLEE你还缺少至少两个#include
s来增强库。请将此减少为一个。这里有很多不相关的代码。由于未声明的SortByExtension
,您的代码无法生成。抱歉@AmiTavory,我省略了SortByExtension
的声明以缩小问题的规模。对不起,有个错误。谢谢。STL中的大多数谓词都是通过副本传递的。你能摆脱你的虚拟界面,改用模板吗?@JaeJunLEE你还缺少至少两个#include
s来增强库。请将此减少为一个。这里有很多不相关的代码。谢谢,代码与std::ref
配合使用效果很好,但是我的代码将在没有c++11的情况下运行,因此我尝试了boost::ref
,结果出现了新的错误。我可以将boost::ref
与boost::bind
结合使用。像这样boost::bind(boost::ref(fileSorter),\u 1,\u 2)
@JaeJunLEE,这是因为boost::reference\u包装器
不提供调用操作符。你真的需要多态比较器吗?否则,是的,bind
解决方案的作用与std::ref
相当。是的,@Barry。因为我将定义几个比较器,这些比较器可以传递给文件列表
构造函数。谢谢,代码与std::ref
配合使用效果很好,但我的代码将在没有c++11的情况下运行,所以我尝试了boost::ref
,结果出现了新的错误。我可以将boost::ref
与boost::bind
结合使用。像这样boost::bind(boost::ref(fileSorter),\u 1,\u 2)
@JaeJunLEE,这是因为boost::reference\u包装器
不提供调用操作符。你真的需要多态比较器吗?否则,是的,bind
解决方案的作用与std::ref
相当。是的,@Barry。因为我将定义几个可以传递给FileList
构造函数的比较器。
std::sort(this->begin(), this->end(), std::ref(fileSorter));
template <class Sorter>
FilesList(const std::string& dir, const std::string& f_regex, Sorter fileSorter) {
// ...
std::sort(begin(), end(), fileSorter); // now copying is fine
}
bool SortByExtension::operator()(const path&, const path&) const