如記錄here,爲std::priority_queue
模板的簽名是:
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
所以你需要指定底層的容器作爲模板參數。你不能依賴默認的模板參數,因爲你試圖指定比較器(第三個模板參數)。另外,我不確定您指定比較器的方式是否正確...您可能想要專門std::less
爲vertex
以使用您的自定義比較函數,並依賴於默認的模板參數。
你可以試試這個:
class vertex;
bool compareVertex(vertex *v1, vertex *v2);
namespace std {
template<>
struct less <vertex*> {
bool operator() (vertex* lhs, vertex* rhs) const {
return compareVertex(lhs, rhs);
}
};
}
std::priority_queue<vertex*> pq;
請注意,您的less
專業化具有全局或std
命名空間裏被定義。
編輯:
顯然,從評論,您compareVertex
函數實際上是一些類的成員函數。
在這種情況下,你可能想要做這樣的事情:
struct VertexComparator {
explicit VertexComparator(graph& g)
: graph_(g) {
}
bool operator() (vertex* lhs, vertex* rhs) const {
return graph_.compareVertex(lhs, rhs);
}
private:
graph& graph_;
};
typedef priority_queue<vertex*, vector<vertex*>, VertexComparator> tVertexPriorityQueue;
graph aGraphInstance;
tVertexPriorityQueue pq(VertexComparator(aGraphInstance));
bool graph :: compareVal(vertex * v1,vertex * v2){ return v1-> dist dist; } –
Sherwin
上面是我的comparaVertex(名稱不同,我的comparaVertex是圖的成員函數),我嘗試了你告訴我的方式,但是他們仍然存在一些問題,當我寫'const'時,編譯器告訴我「預期';'在聲明列表末尾「和」operator()「不能是變量或數據成員的名稱。」然後我刪除了'const',編譯器告訴我「在沒有對象參數的情況下調用非靜態成員函數」在「return graph :: comparaVertex(v1,v2);」我對所有這些錯誤感到困惑,你能幫我解決嗎? – Sherwin
這是我的零件上很多愚蠢的語法錯誤。他們現在已經修好了,對此抱歉。 –