我要按以下方式使用qSort()
。
我有一个比较函数
bool CStreamSetup::compareNames(const QString &s1, const QString &s2)
{
QString temp1 = s1.section("Stream", 1);
temp1 = temp1.section('_', 0, 0);
QString temp2 = s2.section("Stream", 1);
temp2 = temp2.section('_', 0, 0);
return (temp1.toInt() < temp2.toInt());
}
和一个包含160个元素的QStringList,名为QStringList childKeys;
当我如下调用QSort函数时:
qSort(childKeys.begin(), childKeys.end(), compareNames);
出现以下错误。
'compareNames': non-standard syntax; use '&' to create a pointer to member
'qSort': no matching overloaded function found
'void qSort(Container &)': expects 1 arguments - 3 provided
'void qSort(RandomAccessIterator, RandomAccessIterator)' expects 2 arguments - 3 provided
谢谢你们!
答案 0 :(得分:1)
比较器不能是类的方法(类方法需要为其调用对象的对象)。您可以在compareNames
类中将CStreamSetup
定义为静态函数:
class CStreamSetup {
static bool CStreamSetup::compareNames(const QString &s1, const QString &s2);
// ^^^
};
compareNames
的定义保持不变。
bool CStreamSetup::compareNames(const QString &s1, const QString &s2)
{
QString temp1 = s1.section("Stream", 1);
//...
}
或者您可以将比较器定义为自由函数:
bool compareNames(const QString &s1, const QString &s2)
{
QString temp1 = s1.section("Stream", 1);
//...
}
答案 1 :(得分:1)
如果要将成员函数用作比较器,则成员函数必须为static
:
static bool compareNames(const QString &s1, const QString &s2);
另一种方法(C ++ 11和更高版本)是使用lambda:
qSort(childKeys.begin(), childKeys.end(), [this](const QString &s1, const QString &s2) {
return compareNames(s1, s2);
});
旁注:根据docs,qSort
已过时,Qt建议改用std::sort
。