【发布时间】:2017-05-29 11:05:59
【问题描述】:
此代码有效:
#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;
}
为什么?
我所了解的是greater<int>() 是一个函数对象,priority_queue 接受一个二元谓词作为第三个参数,谓词是一种特殊类型的函子。
但是这对大括号是如何产生这种差异的。
【问题讨论】:
-
那么,函数和调用函数有什么不同呢?
-
std::greater<int>是一个类型,用 () 就变成了构造函数调用 -
因为第三个模板参数应该是 type 而不是对象?
-
我真的不明白这个问题。为什么对 C++ 代码添加随机括号会导致编译错误感到惊讶?
-
@Manohar 我想知道你的问题被否决了。事实上,这里的大多数 cmets 都是错误的。这表明你的问题很好。我投了赞成票。
标签: c++ c++11 templates predicate functor