2016-01-31 93 views
0

這是我比較類:Priority Queue沒有名爲top()的成員?

template <class T> 
class EdgeComparator{ 
    public: 
     bool operator()(std::pair<Edge<T>, int>& lhs, std::pair<Edge<T>, int>& rhs) const{ 
      return lhs.second <= rhs.second; 
     } 
}; 

這裏是我的優先級隊列初始化:

//Initialize the priority queue 
std::priority_queue< 
    std::pair<Edge<T>,int>, 
    std::vector<std::pair<Edge<T>,int>, 
    EdgeComparator<T>> 
> pQueue; 

這裏就是發生錯誤 - 對預編譯器奇怪的錯誤信息流後:

std::pair<Edge<T>, int> topEdge = pQueue.top(); 
./Prim.cpp:60:54: error: ‘class std::priority_queue<std::pair<Edge<int>, int>, std::vector<std::pair<Edge<int>, int>, EdgeComparator<int> >, std::less<std::pair<Edge<int>, int> > >’ has no member named ‘top’ 
     std::pair<Edge<T>, int> topEdge = pQueue.top(); 

ATTEMPT 1(對Comparator params增加了const):

template <class T> 
class EdgeComparator{ 
    public: 
     bool operator()(const std::pair<Edge<T>, int>& lhs, const std::pair<Edge<T>, int>& rhs) const{ 
      return lhs.second <= rhs.second; 
     } 
}; 
+0

嘗試'const std :: pair ,int> topEdge = pQueue.top();' – smac89

+4

您收到的第一條錯誤消息是正確的。隨後的錯誤消息可能是無稽之談,這取決於編譯器通過什麼來取代先前的消息。任何出現在怪異錯誤消息之後的東西都不應該被認真對待。 –

+0

如果'Edge'不是可複製構造的(或者它的移動構造函數不是'noexcept'),那麼'vector'可能無法實例化,然後可能無法定義'priority_queue :: reference',然後'top'可能同樣失敗。正如Pete所說,看到第一個錯誤。 – Potatoswatter

回答

0

我想我已經找到一個微妙的錯誤在這裏:

std::priority_queue< 
    std::pair<Edge<T>, int>, 
    std::vector<std::pair<Edge<T>, int>, 
            ^^ 
    EdgeComparator<T> > > pQueue; 
         ^^^ 

看起來應該走這條路:

std::priority_queue< 
    std::pair<Edge<T>, int>, 
    std::vector<std::pair<Edge<T>, int> >, 
             ^^^^ 
    EdgeComparator<T> > pQueue; 
        ^^^ 

第一個聲明並不建立適合我。此外,該錯誤消息說明我的建議。仔細一看:

./Prim.cpp:60:54: error: ‘class std::priority_queue<std::pair<Edge<int>, int>, 
std::vector<std::pair<Edge<int>, int>, EdgeComparator<int> >, 
std::less<std::pair<Edge<int>, int> > >’ has no member named ‘top’ 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

它的使用,而不是你自己的類EdgeComparator<>的標準比較std::less<>。因此,我得出結論,比較器模板參數在您的聲明中缺失,這是因爲缺少角度大括號,因此它站在錯誤的位置。

相關問題