Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::sort时禁止使用函子(inherrited)?_C++_Sorting_Stl_Functor - Fatal编程技术网

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