【发布时间】:2019-11-16 05:02:41
【问题描述】:
为什么这两种情况的文档都说了同样的话,但它们以相反的方式声明,一种使用greater<int>,而另一种使用greater<int>()。有人能解释一下吗?
文档priority_queue cpp library 说comp
可以是用于对堆进行排序的比较对象。这可能是一个 函数指针或函数对象
priority_queue<int, vector<int>, greater<int>> minheap; //works
priority_queue<int, vector<int>, greater<int>() > minheap; //why fail?
cpp library sort 的文档也说了同样的话,即 comp 既可以是函数指针,也可以是函数对象。
sort (numbers.begin(), numbers.end(), std::greater<int>()); //works
sort (numbers.begin(), numbers.end(), std::greater<int>); //fail
【问题讨论】:
-
一个是模板参数,另一个是函数参数(
<>和()不同)。 -
但是文档说这两种情况都应该能够使用函数参数(函数对象或指针),因此 Greater
() 应该适用于这两种情况,对吧?为什么priority_queue会失败 -
是的,如果你将它传递给构造函数,而不是作为模板参数。您可以在模板参数中指定类型
std::greater<int>,然后在构造函数参数中传递该类型的对象std::greater<int>()。 -
我很惊讶没有人提到当用作类型时,
std::greater<int>()不仅仅是一个直接错误,而是一个表示返回std::greater<int>的函数的有效类型。当编译器意识到函数类型不适合作为比较器时,您会从编译器得到错误。 -
@eerorika Greater
() 是类型说明符或表达式,具体取决于使用的上下文。:) 例如,如果您将构造括在括号中,则不会有歧义。 :)
标签: c++ c++11 object templates types