1

我使用STL priority_queue並給出一個自定義比較器類,其構造函數接受指向存儲優先級的向量的指針,因此 -錯誤:請求「..」中的成員'..',屬於非類別類型

#include <iostream> 
#include <queue>   // std::priority_queue 
#include <vector>   // std::vector 

using namespace std; 

class CompareReachDist 
{ 
    const vector<float> *reach_dists; 
public: 
    CompareReachDist(const vector<float> *input) 
    { 
     reach_dists = input; 
    } 

    bool operator() (const size_t &l, const size_t &r) const 
    { 
     return (reach_dists->at(l) > reach_dists->at(r)); 
    } 
}; 

typedef priority_queue<size_t, vector<size_t>, CompareReachDist> pq; 
vector<float> reach_dists; 

int main() 
{ 
    pq seeds(CompareReachDist(&reach_dists)); 
    bool isEmpty = seeds.empty(); 

    return 0; 
} 

然而,在編譯我得到的錯誤:

error: request for member 'empty' in 'seeds', which is of non-class type 'pq(CompareReachDist&) {aka std::priority_queue<unsigned int std::vector<unsigned int>, CompareReachDist>(CompareReachDist&)}' 

我要去哪裏錯了?

回答

3

這是一個解析問題。讓我們把它分解開:

CompareReachDist(&reach_dists) 

你可能會認爲這會創建一個臨時CompareReachDist與靜態reach_dists的地址。但是在總體聲明中,它被解釋爲對CompareReachDist的引用。奇怪,但是這是因爲,大致來說,C++的語法支持函數聲明來對象聲明。以下

pq seeds(CompareReachDist(&reach_dists)); 

是一個函數的整體聲明。它接受CompareReachDist&並返回pq

您收到的錯誤很明顯是因爲一個函數沒有可以調用的empty成員。

自C++ 11以來的解決方案是傾向列表初始化,這會打破作爲函數聲明的歧義和解決方案。所以你可以這樣做:

pq seeds{CompareReachDist{&reach_dists}}; 

並得到一個對象,如人們所期望的那樣。

+0

啊,是的。我現在看到它。你認爲我應該重構我的對象聲明,以便編譯器不再將它用於函數聲明嗎? –

+0

@ ameya.dubey - 好的,更喜歡C++ 11初始化語法。或者爲'CompareReachDist'參數引入一個命名變量。 – StoryTeller

+0

@ ameya.dubey - 確實如此。很高興有幫助。 – StoryTeller

相關問題