2017-01-27 19 views
-1

Я определил класс, а затем сохранил указатель на Foo в priority_queue и использовал функцию cmp, которую я определил.различия между функциональным объектом и указателем функции?

но если КСС-Funtion вызывает функцию-объект, возникает ошибка:

class Foo 
{ 
    friend bool cmp(Foo *, Foo *); 
public: 
    Foo() = default; 
    Foo(int x):val(x) {} 
private: 
    int val; 
}; 
bool cmp(Foo *a, Foo *b) 
{ 
    return a->val < b->val; 
} 
int main() 
{ 
    priority_queue<Foo*, vector<Foo*>, decltype(cmp)*> que; 
    que.push(new Foo(5)); 
    que.push(new Foo(6)); 
    return 0; 
} 

functione-объект работает в обычном режиме.

class Foo 
{ 
    friend struct cmp; 
public: 
    Foo() = default; 
    Foo(int x):val(x) {} 
private: 
    int val; 
}; 
struct cmp 
{ 
    bool operator()(Foo *a, Foo *b) 
    { 
     return a->val < b->val; 
    } 
}; 
int main() 
{ 
    priority_queue<Foo*, vector<Foo*>, cmp> que; 
    que.push(new Foo(5)); 
    que.push(new Foo(6)); 
    return 0; 
} 
+0

IDE является кодом :: blocks – Wonter

+1

"возникает ошибка"? В самом деле? –

+0

не компилировать ошибку – Wonter

ответ

2

Вы должны построить свой que переменную с помощью функции вы хотите использовать в качестве сравнения.

#include <vector> 
#include <queue> 

using namespace std; 

class Foo 
{ 
    friend bool cmp(Foo*, Foo*); 
public: 
    Foo() = default; 
    Foo(int x):val(x) {} 
private: 
    int val; 
}; 
bool cmp(Foo* a, Foo* b) 
{ 
    return a->val < b->val; 
} 
int main() 
{ 
    //              vvv 
    priority_queue<Foo*, vector<Foo*>, decltype(cmp)*> que(cmp); 
    que.push(new Foo(5)); 
    que.push(new Foo(6)); 

    return 0; 
} 
Смежные вопросы