Я работаю с Priority_queue на C++ и столкнулся с проблемой при использовании статической функции-члена в качестве специального компаратора внутри класса.
Воспроизводимым примером будет:
#include <bits/stdc++.h>
using namespace std;
class testClass {
private:
static bool comp(const int& a, const int& b) {
return a > b;
}
priority_queue<int, vector<int>, decltype(&testClass::comp)> q;
public:
void push(int num) {
q.push(num);
}
};
int main() {
testClass t;
t.push(0);
t.push(0);
return 0;
}
Второй вызов push
вызывает ошибку. Я думаю, это означает, что функция-член comp
не может быть вызвана q
.
Однако когда я меняю функцию-член на лямбда-функцию вне класса, а затем ссылаюсь на нее с помощью decltype(comp)
, код работает нормально.
Может ли кто-нибудь объяснить, почему статическая функция-член вызывает эту проблему и почему вместо этого работает лямбда-подход?
odd
инициализирован? Стоит ли проверять q_large.empty()
перед тем, как звонить top()
и pop()
? godbolt.org/z/ndobv9qsP
Спасибо за ваши комментарии и мне очень жаль за беспокойство. Я отредактировал его в воспроизводимый пример.
Проблема не в том, что вы используете статическую функцию-член в качестве компаратора. Проблема в том, что вы им не пользуетесь.
std::priority_queue<int, vector<int>, decltype(&comp)> q;
Компаратор не передается конструктору, и используется одна конструкция по умолчанию (null).
Вы должны передать компаратор конструктору
std::priority_queue<int, vector<int>, decltype(&comp)> q{comp};
Могу поспорить, что дублированный вопрос должен быть на SO, но я не могу его найти.
Можете ли вы опубликовать минимально воспроизводимый пример ? Я частично выполнил вашу работу, но не могу воспроизвести сбой godbolt.org/z/W66rva8rM