此代码有效:
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int> > pq;
pq.push(1);
cout<<pq.top()<<endl;
}
但是,此代码无法编译:
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int>() > pq;
pq.push(1);
cout<<pq.top()<<endl;
}
为什么?
我所理解的是,更大的< int>()是一个函数对象,priority_queue接受二元谓词作为第三个参数,谓词是一种特殊类型的仿函数.
但是这对括号如何产生差异呢?
解决方法:
在这个宣言中
priority_queue<int,vector<int>,greater<int> > pq;
类型模板参数更大< int>对应于结构的类型.
在这个宣言中
priority_queue<int,vector<int>,greater<int>() > pq;
类型模板参数greater< int>()对应于没有参数且返回类型更大的函数的类型< int>
类模板std :: priority_queue期望参数将是函数对象类型,它是指向函数的指针或具有函数运算符的类类型.
为了更清楚地比较这些声明
std::vector<int()> v1;
和
std::vector<int (*)()> v2;
对于第一个声明,编译器将发出错误,因为运算符sizeof可能不适用于函数类型int(),并且向量将无法为其元素分配内存.这里用作类型模板参数的int()不是表达式.这是一个类型ID.
在第二个声明中,向量处理指向函数的指针,它可以为其作为指针的元素分配内存.