2010-12-03 112 views
2

我有一個函數需要根據一些輸入參數返回一個排序列表。我已選擇一個std::priority_queue來保存此列表。用自定義比較器返回priority_queue

但編譯器給我一個我不認識的錯誤。下面是我的代碼:

struct DepthCompare { 
    bool operator() 
     (const struct inst *&lhs, const struct inst *&rhs) const 
    { 
     return lhs->depth < rhs->depth; 
    } 
}; 

typedef priority_queue<struct inst*> HeuristicList; 
HeuristicList getHeuristicList(struct BasicBlock &) { 

    HeuristicList ret(DepthCompare); 
    return ret; 
} 

編譯器說,在return語句的線路conversion from 'HeuristicList (*)(DepthCompare)' to non-scalar type 'HeuristicList' requested

它看起來不像我試圖返回一個指針。出了什麼問題?

回答

5

你有兩個問題。

要使用自定義比較,你必須指定比較類型作爲第三個模板參數:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList; 

HeuristicList ret(DepthCompare);被解釋爲函數聲明,而不是一個變量聲明,給你是錯誤看到。你需要通過比較器的一個實例,並確保它不能被解釋爲函數聲明:

HeuristicList ret = HeuristicList(DepthCompare()); 

然而,由於constuctor的第一個參數是可選的,默認爲缺省構造比較,你可以簡單地寫

HeuristicList ret; 

或者,因爲你只是返回變量直線距離,

return HeuristicList(); 
+0

謝謝。爲了理解這一切,我有更多的閱讀需要做。來自Java,我幾次繞過匿名對象,並認爲C++將是相同的方式。當然,爲了清楚起見,我省略了`getHeuristicList()`的主體,所以我不會立即返回它。 我也需要手冊來解釋gcc的錯誤信息! – Mike 2010-12-04 17:45:57

0

請注意,比較器是priority_queue的第三個模板參數。您必須聲明你的priority_queue像這樣:

typedef priority_queue<inst*, vector<inst*>, DepthCompare> HeuristicList; 

這是假設你想使用vector爲後盾容器(默認)。

另請注意,在您的比較器函數中,您希望將參數聲明爲對指針的const引用。你有什麼是對const指針的引用。你想這樣的:

bool operator()(inst* const& lhs, inst* const& rhs) const 

你也不需要你的比較對象的實例傳遞給priority_queue構造,作爲默認的構造比較會做就好了。