具有自定义比较功能的C++优先级队列

Fon*_*007 6 c++ priority-queue

我正在尝试使用自定义比较函数创建一个优先级队列,作为类的数据成员.如果我将队列放在一个类中,代码将无法编译,但是如果它在main函数内部则可以正常工作:

#include <queue>
#include <vector>
using namespace std;

bool cmp(int x, int y) { return (x > y); }

class A {
public:
private:
    priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // Error at pq(cmp) : function "cmp" is not a type name
};


int main() {

    priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // no error here
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Microsoft VS2015获取上述代码.将cmp函数放在类中是没有区别的.你能解释一下为什么会发生这种情况并为此做出解决方案吗

编辑1:

这行 main

priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // no error here
Run Code Online (Sandbox Code Playgroud)

确实产生错误,但我的IDE无法检测到它.使用decltype(&cmp)将消除此错误.

Dan*_*our 9

首先,我在考虑编译器中的错误,但我可以重现它.然后它突然变得明显:

foo bar(baz);
Run Code Online (Sandbox Code Playgroud)

仔细观察,这与您的代码中的模式相同.由于最令人烦恼的解析,这是一个函数声明!

因此,您尝试声明pq此处命名的函数,返回优先级队列并具有单个参数类型cmp.但是,编译器无法找到该类型.

更改为使用支撑初始化应解决此问题:

#include <queue>
#include <vector>
using namespace std;

bool cmp(int x, int y) { return (x > y); }

class A {
public:
private:
    priority_queue<int, vector<int>, decltype(&cmp) > pq{cmp};
};


int main() {
   // priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // this is wrong, too
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(Ideone)

但请不要问我为什么它在函数内部工作.它也不在函数内部工作.