2016-01-19 49 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訪問數據項並進行打印。