2014-03-28 107 views
0
class vertex; 
bool compareVertex(vertex *v1, vertex *v2); 
std::priority_queue<vertex *, decltype(compareVertex)*> pq(compareVertex); 

上面的代碼有什麼問題?我已經聲明並定義了vertex和compareVertex,但是編譯器告訴我:「unknown type name'pq'」和「必須調用非靜態成員函數的引用」關於聲明的這個C++代碼有什麼問題?

感謝您的閱讀。

回答

0

如記錄here,爲std::priority_queue模板的簽名是:

template< 
    class T, 
    class Container = std::vector<T>, 
    class Compare = std::less<typename Container::value_type> 
> class priority_queue; 

所以你需要指定底層的容器作爲模板參數。你不能依賴默認的模板參數,因爲你試圖指定比較器(第三個模板參數)。另外,我不確定您指定比較器的方式是否正確...您可能想要專門std::lessvertex以使用您的自定義比較函數,並依賴於默認的模板參數。
你可以試試這個:

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)); 
+0

bool graph :: compareVal(vertex * v1,vertex * v2){ return v1-> dist dist; } – Sherwin

+0

上面是我的comparaVertex(名稱不同,我的comparaVertex是圖的成員函數),我嘗試了你告訴我的方式,但是他們仍然存在一些問題,當我寫'const'時,編譯器告訴我「預期';'在聲明列表末尾「和」operator()「不能是變量或數據成員的名稱。」然後我刪除了'const',編譯器告訴我「在沒有對象參數的情況下調用非靜態成員函數」在「return graph :: comparaVertex(v1,v2);」我對所有這些錯誤感到困惑,你能幫我解決嗎? – Sherwin

+0

這是我的零件上很多愚蠢的語法錯誤。他們現在已經修好了,對此抱歉。 –

0

您在優先級隊列的構造函數中缺少第三個模板參數。

請參閱post以供參考。

+0

我得到它,但即使我給它一個容器,我仍然不知道如何對其進行初始化。我嘗試了幾種方法,但答案仍然是錯誤的。 – Sherwin