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;
}
但是请不要问我为什么它在函数内部工作。它在函数内部也不工作。
我正在尝试使用自定义比较函数创建优先级队列,作为 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;
}
但是请不要问我为什么它在函数内部工作。它在函数内部也不工作。