std :: less:错误C2661:'std :: less< _Ty> :: less':没有重载函数需要2个参数

时间:2012-04-21 15:40:05

标签: c++ templates stl std

我对std :: less有一个奇怪的问题。

indexedpriorityq.hpp(21): error C2661: 'std::less<_Ty>::less' : no overloaded function takes 2 arguments
1>          with
1>          [
1>              _Ty=float
1>          ]

但是它不应该做什么?

这是我的一些代码:

template<class KeyType, class binary_predicate = std::less<KeyType> >
class IndexedPriorityQ
{
 private:
    typedef typename std::vector<KeyType> KEYLIST;
    KEYLIST& m_Keys_V;

    [...]
};

template<class KeyType, class binary_predicate>
void IndexedPriorityQ<KeyType, binary_predicate>::
    ReorderUpwards(int size)
{
    while( (size>1) && 
        (binary_predicate(m_Keys_V[m_Heap_V[size]], m_Keys_V[m_Heap_V[size/2]])) //breaks here
         )
    {
        Swap(size/2, size);
        size /= 2;
    }
}

究竟是什么导致错误,我该如何解决?

1 个答案:

答案 0 :(得分:2)

std::less是一个仿函数,其构造函数接受0个参数。也就是说,你创建这样的objcet:

std::less<Key> a;

然后,你就这样使用它:

if(a(x,y)) ...

甚至

if(std::less<Key>()(x,y)) ...

有些仿函数的构造函数需要多于0个参数,比如std::bind1st。规则是如果函子是二进制的,那么它的operator()需要2个参数。