2016-01-19 18 views
0

我想做一个优先级队列,其中最顶部的元素包含最小的整数。我做了一个比较功能对象。一切都很顺利,但是,每当我试图打印出最上面的元素std::cout<<pq.top<<std::endl我得到一个错误,指出:C++编程候选函数不可行

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

你也有一个问题,你的比较函数。比较功能应该返回true如果dat1.data > dat2.data为了获得最小的元素顶部。这样,您应将其更改为:

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

此外,我宁愿让bool操作符()将Foo的常量引用('const Foo&')。 – axalis

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

在上面的行中的呼叫pq.top()返回一个Foo对象,你的程序不知道打印。所以这会产生错误。通过使用&pq.top(),您可以打印对象的地址,但由于您不想立即执行此操作,因此您可以使用pq.top().data访问数据项并进行打印。