std :: greater <int>()期望0个参数(或1个参数),2提供,为什么?

时间:2015-05-04 13:50:20

标签: c++ stl

这是在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。

2 个答案:

答案 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;