具有Lambda比较器错误的C ++ priority_queue

问题描述 投票:41回答:3

我有以下错误代码,正在尝试在VC2010中进行编译,但是我遇到了错误C2974,该错误仅在包含lambda表达式时才会发生,因此我猜测它与此有关。

typedef pair<pair<int, int>, int> adjlist_edge;
priority_queue< adjlist_edge , vector<adjlist_edge>,
    [](adjlist_edge a, adjlist_edge b) -> bool {
        if(a.second > b.second){ return true; } else { return false; }
    }> adjlist_pq;

我知道模板定义的形式正确为

priority_queue<int , vector<int>, greater<int>> pq;

按预期工作。有什么想法我做错了吗?我可能忽略的lambda明显有问题吗?感谢您的阅读!

c++ stl lambda c++11 priority-queue
3个回答
62
投票

首先定义lambda对象,然后使用decltype将其传递给模板的类型,然后将其直接传递给构造函数。

auto comp = []( adjist a, adjlist b ) { return a.second > b.second; };
priority_queue< adjlist_edge , vector<adjlist_edge>, decltype( comp ) >
     adjlist_pq( comp );

16
投票

priority_queue将比较器作为模板参数。 Lambda函数是对象,因此不能用作模板参数(只能有很少的类型,其中包括整数类型)。


0
投票

接受的答案回答了[[how

© www.soinside.com 2019 - 2024. All rights reserved.