必须使用 '.*' 或 '->*' 在 'lessThan (...)' 中调用指向成员函数的指针,例如 '(... ->* lessThan) (...)'

Jel*_*ser 5 c++ qt qsort qlist

我正在尝试根据 QDateTime 对 QList 进行排序,但出现以下错误:

must use '.*' or '->*' to call pointer-to-member function in 'lessThan (...)', e.g. '(... ->* lessThan) (...)'
 if (lessThan(*end, *start))
                          ^
Run Code Online (Sandbox Code Playgroud)

排序功能:

bool sortRecord(Record left, Record right){
    return left.getArrival().getDate() < right.getArrival().getDate();
}
Run Code Online (Sandbox Code Playgroud)

函数是这样调用的:

qSort(recordList.begin(), recordList.end(), sortRecord);
Run Code Online (Sandbox Code Playgroud)

Record 中到达的 getter 和 setter:

void Record::setArrival(Arrival arrival){
    this->arrival = arrival;
}
Arrival Record::getArrival(){
    return this->arrival;
}
Run Code Online (Sandbox Code Playgroud)

getDate() 到达功能:

QDateTime Arrival::getDate(){
    QDateTime qDateTime;

    QDate qDate;
    qDate.setDate(date.getDateYear(), date.getDateMonth(), date.getDateDay());
    qDateTime.setDate(qDate);

    vector<string> timeS = splitTime(time.getTimeFrom());

    QTime qTime;
    qTime.setHMS(stoi(timeS[0]), stoi(timeS[1]), 0);
    qDateTime.setTime(qTime);

    return qDateTime;
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

谢谢!

Jon*_*ely 6

问题就在这里:

qSort(recordList.begin(), recordList.end(), sortRecord);
                                            ^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

您不能使用非静态成员函数作为排序函数,因为需要在某个对象上调用非静态成员函数(以提供指针this)。你不能像普通函数一样调用成员函数,这就是编译器错误的含义。如果您阅读了整个错误消息,而不仅仅是第一行,那么它会告诉您它来自上面的行。

要么使该sortRecord函数成为非成员函数,要么使其成为static成员函数。

为什么它是一个成员函数?它不访问*this或使用任何私有成员...这听起来像糟糕的面向对象风格,这不是我们在 C++ 中做事的方式(参见例如非成员函数如何增加封装)。

另外,为什么您的sortRecord函数要复制其参数而不是使用引用?(参见https://isocpp.org/wiki/faq/references#call-by-reference

如果您想将所有内容编写为成员函数并具有按引用传递语义,那么请使用 Java,而不是 C++。否则,请停止用 C++ 编写 Java 代码。

  • 你可能想降低语气。OP 对于 C++ 来说显然是新的。你可以发布一些暗示性的反馈,而不是因为他的尝试而责备他。我们都曾对某件事物感到陌生,甚至包括你,爱因斯坦。 (15认同)

san*_*jay 1

尝试使用此功能进行排序。

bool sortRecord(const Record& left, const Record& right)
{ 
    return left.getArrival().getDate() < right.getArrival().getDate(); 
}
Run Code Online (Sandbox Code Playgroud)

还要确保 getArrival() 和 getDate() 是 const 方法。