2011-11-21 22 views
8

所以我有一個數組(0 - n),保存值,我希望std :: set用於它的排序。 該陣列是unsigned int 成本 [n]爲什麼我不能用謂詞的實例來構造std :: set,但是我可以指定一個構建的std :: set嗎?

我用下面的仿函數此排序:

struct ProxySorter { 
    ProxySorter(const unsigned* arr) : proxy_array(arr) {} 
    bool operator()(const unsigned& a, const unsigned& b) const { 
    return proxy_array[a] < proxy_array[b]; 
    } 
    const unsigned* proxy_array; 
}; 

所以這裏的問題... 當我構建了一套,這是合法的:

std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost)); 

我沒有得到任何錯誤,並且一切按預期工作。但這似乎被黑了,馬虎。

然而,這顯然是違法的:

std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost)); 

試圖做到與ProxySorter(成本)構造就造成了一堆錯誤,說這樣的東西對每個組成員電話:

error: request for member erase in node_queue, which is of non-class type std::set<unsigned int, ProxySorter>(ProxySorter)

常規施工有什麼問題?爲什麼分配工作?這裏有什麼不同,我錯過了?任何幫助非常感謝,謝謝。

哦,對於問題的標題很抱歉,我真的不知道該怎麼稱呼它。

回答

13

Most-vexing-parse。你需要另外一對括號:

std::set<unsigned, ProxySorter> node_queue((ProxySorter(cost))); 

否則將被解釋爲一個函數返回你的設定種類以及採取命名costProxySorter類型的參數聲明。

+0

爲什麼,因爲否則它被解析爲函數聲明?哇。 –

+0

哇。那麼我從來不會想到這一點。 –

+0

@John:是的,看到我的小編輯和鏈接。 – Xeo

相關問題