我试图实现一个类,我可以根据一些不同的sort函数对文件列表进行排序。 我无法使用指针数组来调用函数。
FileList.hpp:
class FileList
{
public:
enum sortStyle{EXTENSION, NAME, SIZE, DURATION, PATH};
//...
};
namespace SortFiles
{
struct sortFcts{
FileList::sortStyle sort;
bool (*fonc)(const FileData &, const FileData &);
};
bool sortExtension(const FileData &a, const FileData &b);
bool sortName(const FileData &a, const FileData &b);
bool sortDuration(const FileData &a, const FileData &b);
bool sortSize(const FileData &a, const FileData &b);
bool sortPath(const FileData &a, const FileData &b);
}
struct SortFiles::sortFcts tabSortFctsFileList[5] = {{FileList::EXTENSION, &SortFiles::sortExtension},
{FileList::NAME, &SortFiles::sortName},
{FileList::SIZE, &SortFiles::sortSize},
{FileList::DURATION, &SortFiles::sortDuration},
{FileList::PATH, &SortFiles::sortPath}};
FileList.cpp:
void FileList::sort(FileList::sortStyle a)
{
//std::stable_sort((this->_data).begin(), (this->_data).end(), SortFiles::sortPath);
std::stable_sort((this->_data).begin(), (this->_data).end(), tabSortFctsFileList[a]);
}
其中tabSortFctsFileList []只是我结构的一个选项卡,我放置了所有的排序方法。 我的问题是,如果我使用注释的方式它可以工作,但是当我使用数组时,我有一个编译错误,我不知道为什么。我知道我可以使用一个巨大的开关,它可以正常工作,但我不想。
这是错误消息的一行:
/usr/include/c++/4.8/bits/stl_algo.h:
In instantiation of ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<FileData*, std::vector<FileData> >; _Compare = SortFiles::sortFcts]’:
/usr/include/c++/4.8/bits/stl_algo.h:3510:49:
required from ‘void std::__inplace_stable_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<FileData*, std::vector<FileData> >; _Compare = SortFiles::sortFcts]’
/usr/include/c++/4.8/bits/stl_algo.h:5710:52:
required from ‘void std::stable_sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<FileData*, std::vector<FileData> >; _Compare = SortFiles::sortFcts]’
FileList.cpp:71:88: required from here
/usr/include/c++/4.8/bits/stl_algo.h:2159:29: error: no match for call to ‘(SortFiles::sortFcts) (FileData&, FileData&)’
if (__comp(*__i, *__first))
我觉得这里的问题是我不应该使用(* fonc)而不是fonc作为最后一个参数,但我已经尝试过这样的事情:(Tab [a])但是它说我没有匹配运营商。 我该怎么做才能解决它?
答案 0 :(得分:0)
您正在尝试传递sortFcts
类型的对象作为std::stable_sort()
的谓词参数。但是,对象类型sortFcts
不可调用。有两个简单的修复:
更简单[和推荐]修复只是获取对象的fonc
成员:
... tabSortFctsFileList[a].fonc ...
通过添加合适的函数调用运算符,使sortFcts
类型的对象可调用为谓词:
struct sortFcts {
// ...
bool operator()(const FileData &a, const FileData &b) const {
return this->fonc(a, b);
}
};