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)
将消除此错误.
首先,我在考虑编译器中的错误,但我可以重现它.然后它突然变得明显:
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)
但请不要问我为什么它在函数内部工作.它也不在函数内部工作.