2016-01-19 2 views
0

Я пытаюсь сделать очередь приоритетов, в верхней части которой содержится наименьшее целое число. Я сделал объект функции для сравнения. Все идет хорошо, но всякий раз, когда я пытаюсь напечатать верхний элемент наиболее std::cout<<pq.top<<std::endl я получаю ошибку, которая говорит:Функция кандидата на программирование на языке С ++ не является жизнеспособной

candidate function not viable: no known conversion from 'const value_type' (aka 'const Foo') to 
    'const void *' for 1st argument; take the address of the argument with & 
basic_ostream& operator<<(const void* __p); 

Я действительно новичок в программировании так, я действительно не знаю, что делать.

#include<iostream> 
#include<queue> 
#include <vector> 


class Foo 
{ 
public: 
    int data; 
    Foo(int data): data(data) {} 
}; 

class Compare 
{ 
public: 
    int operator() (Foo dat1, Foo dat2) 
    { 
     if(dat1.data < dat2.data) 
     return dat1.data; 
     else return dat2.data; 
    } 
}; 

int main() 
{ 
    std::priority_queue<Foo, std::vector<Foo>, Compare> pq; 

    pq.push(5); 
    pq.push(7); 
    pq.push(1); 
    pq.push(2); 
    pq.push(3); 

    std::cout << pq.top() << std::endl; 
    return 0; 
} 
+0

Вы, кажется, пропустили конец своего предложения «но когда я пытаюсь ...:« Что происходит потом? В чем проблема? –

ответ

2

Вы никогда не определяли способ вывода Foo. Вы можете использовать

std::cout << pq.top().data << std::endl; 

Или вы можете перегрузить operator<< для Foo выводить их как

class Foo 
{ 
public: 
    int data; 
    Foo(int data) : data(data) {} 
    friend std::ostream & operator<<(std::ostream& os, const Foo & f) 
    { 
     return os << f.data; 
    } 
}; 

У вас также есть проблема с функцией Comparision. Функция сравнения должна возвращать true, если dat1.data > dat2.data, чтобы получить наименьший элемент в верхней части. При том, что вы должны изменить его на:

bool operator() (const Foo& dat1, const Foo& dat2) 
{ 
    return dat1.data > dat2.data; 
} 
+0

Кроме того, я бы предпочел, чтобы оператор bool() принимал ссылки const на Foo ('const Foo &'). – axalis

0
std::cout << pq.top() << std::endl; 

Вызов pq.top() в строке выше возвращает объект Foo, который ваша программа не знает, чтобы напечатать. Таким образом, генерируется ошибка. Используя &pq.top(), вы можете распечатать адрес объекта, но поскольку это не тот случай, который вы хотите сделать прямо сейчас, вы можете использовать pq.top().data для доступа к элементу данных и его печати.

Смежные вопросы