class 中带有自定义比较函数的 C++ 优先级队列

C++ priority queue with custom compare function in a class

我正在尝试使用自定义比较函数创建优先级队列,作为 class 的数据成员。如果我将队列放在 class 中,代码将无法编译,但是如果它在 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;
}

以上代码我使用的是Microsoft VS2015。我是否将 cmp 函数放在 class 中没有区别。您能否解释为什么会发生这种情况以及可能的解决方案?

编辑 1:

这一行在main

priority_queue<int, vector<int>, decltype(cmp) > pq(cmp); // no error here

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

首先我在考虑你的编译器中的错误,但我 could reproduce 它。然后一下子就明白了:

foo bar(baz);

如果仔细观察,这与您的代码中的模式相同。由于最麻烦的解析,这是一个 函数声明 !

因此,您试图在此处声明一个名为 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;
}

(Ideone)

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