2012-04-21 1 views
0

У меня странная проблема с std :: less.std :: less: ошибка C2661: 'std :: less <_Ty> :: less': никакая перегруженная функция не принимает 2 аргумента

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; 
    } 
} 

Что именно вызывает ошибку, и как я могу это исправить?

ответ

2

std::less является функтором, а его конструктор принимает 0 аргументов. То есть, вы создаете objcet вроде этого:

std::less<Key> a; 

Затем вы используете это так:

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

или даже

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

Есть функторы, чей конструктор принимает более 0 аргументы, такие как std::bind1st. Правило состоит в том, что если функтор двоичный, то его operator() принимает 2 аргумента.

+0

прав, спасибо :) – xcrypt