关于c++用lambda表达式自定义优先级队列出错,如何解决?

这样写,正确创建优先级队列
class mycomparison {
    public:
        bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
            return lhs.second > rhs.second;
        }
    };

    vector<int> topKFrequent(vector<int>& nums, int k) {
        priority_queue<pair<int,int>,vector<pair<int,int>>,mycomparison>pri_que;
这样写 编译器报错,我的lambda表达式写错了吗?
        priority_queue<pair<int,int>,vector<pair<int,int>>,[](pair<int,int>&map1,pair<int,int>&map2)
        {return map1.second>map2.second;} >pri_que;
错误信息:
 error: a lambda expression cannot appear in this context
 priority_queue<pair<int,int>,vector<pair<int,int>>,[](pair<int,int>&map1,pair<int,int>&map2)

构造方法用错了,你l放ambda的地方应该放functype而不是func本身:

#include <queue>
#include <vector>

auto main() -> int
{
    std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>,
                        std::function<bool(std::pair<int, int> & map1,
                                           std::pair<int, int> & map2)>>
    pri_que([](std::pair<int, int> &map1, std::pair<int, int> &map2) -> bool {
        return map1.second > map2.second;
    });
}

Your code is valid C++20 as written but invalid C++11.
可能你使用了c++20的特性,在c++11下不支持吧,可以测试下在c++20下是否有问题。若真是这样,只能换种写法了。
参考这个回答:
C++: lambda-expression in unevaluated context

1.Lambda expressions are not allowed in unevaluated contexts (such as decltype) before C++20.
2.Closure types are not default constructible before C++20. In C++20 a closure type that has no capture is default constructible.

我在c++20下面做了个测试,证明确实是这个问题:

#include <iostream>
#include <charconv> 
#include <array>
#include <system_error>
#include <queue>

int main() {

  std::cout << "hello test" << std::endl;

  using Ty = std::pair<std::string,int>;

  std::priority_queue<Ty,
        std::vector<Ty>,
        decltype( [](Ty a, Ty b)->bool{
                   return a.second > b.second;
        })> q;

  q.emplace(std::make_pair("yang",3));
  q.emplace(std::make_pair("yong",2));
  q.emplace(std::make_pair("zhen",1));

  std::cout << "q.top()=" <<q.top().first <<std::endl;
  return 0;
  
 }

可以跑下这个代码,在c++ 20下面是ok的。但在c++17下则会报错:
test2.cpp:28:19: error: lambda-expression in unevaluated context
decltype( [](Ty a, Ty b)->bool{
^
test2.cpp:30:11: error: template argument 3 is invalid
})> q;
在c++20下面的测试:

img


解决办法:
参照博客:
https://blog.csdn.net/yyz_1987/article/details/124953118