这是在STL头文件中定义的:
template<typename _Tp>
struct greater : public binary_function<_Tp, _Tp, bool>
{
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x > __y; }
};
我只写了一行简单代码如下:
cout << (std::greater<int>(3, 2)? "TRUE":"FALSE") << endl;
它无法编译。错误信息是:
C:\Qt\Tools\mingw482_32\i686-w64-mingw32\include\c++\bits\stl_function.h:222: std::greater<int>::greater()
struct greater : public binary_function<_Tp, _Tp, bool>
^
C:\Qt\Tools\mingw482_32\i686-w64-mingw32\include\c++\bits\stl_function.h:222: note: candidate expects 0 arguments, 2 provided
C:\Qt\Tools\mingw482_32\i686-w64-mingw32\include\c++\bits\stl_function.h:222: std::greater<int>::greater(const std::greater<int>&)
C:\Qt\Tools\mingw482_32\i686-w64-mingw32\include\c++\bits\stl_function.h:222: note: candidate expects 1 argument, 2 provided
怎么了? 编译器当然是minGW(GCC)。
这是我的代码的简化版本。事实上,我在复杂的排序算法中使用了std :: greater。
答案 0 :(得分:4)
std::greater<...>
是一个类,而不是一个函数。这个类已经重载了operator()
,但你需要一个类的对象来调用该运算符。所以你应该创建一个类的实例,然后调用它:
cout << (std::greater<int>()(3, 2)? "TRUE":"FALSE") << endl;
// #1 #2
此处第一对括号(#1
)创建std::greater<int>
的实例,#2
调用std::greater<int>::operator()(const int&, const int&)
。
答案 1 :(得分:0)
std::greater
是一个类模板,而不是一个函数模板。表达式std::greater<int>(3,2)
尝试调用std::greater<int>
的构造函数进行两次整数。
您需要创建一个实例,然后在其上使用operator()
:
cout << (std::greater<int>{}(3, 2)? "TRUE":"FALSE") << endl;