2012-11-18 104 views
1

我以爲我有這個想通,但我想我錯了。我的印象是'< ...>'中的第一個元素是要存儲在隊列中的類型,第二個元素是容器類型(選項是'vector'或'dequeue'),第三個元素是重載'()'運算符進行比較的類。基於此,我認爲下面的代碼應該編譯,但它不會:(STL優先級隊列非類型編譯錯誤

std::priority_queue<uint32_t*, std::vector<uint32_t*>, edgeComparator> q(); 

uint32_t* nodeEdge = new uint32_t[2]; 
nodeEdge[0] = startN; 
nodeEdge[1] = 0; 

q.push(nodeEdge); 

「edgeComparator」的定義如下:

class edgeComparator 
{ 
    public: 
     bool operator() (const uint32_t*& lhs, const uint32_t*& rhs) const 
     { 
     return (lhs[1]>rhs[1]); 
     } 
}; 

這是我得到的錯誤:

./Graph.cpp: In member function `void Graph::findShortestPath()': 
./Graph.cpp:148: error: request for member `push' in `q', which is of non-class type `std::priority_queue<uint32_t*, std::vector<uint32_t*, std::allocator<uint32_t*> >, edgeComparator>()()' 

更糟糕的是,我想 'q.empty()'

./Graph.cpp:150: error: request for member `empty' in `q', which is of non-class type `std::priority_queue<uint32_t*, std::vector<uint32_t*, std::allocator<uint32_t*> >, edgeComparator>()()' 
時也會出現此錯誤

回答

3

您有:

std::priority_queue<uint32_t*, std::vector<uint32_t*>, edgeComparator> q(); 

但是相反,你應該使用:

std::priority_queue<uint32_t*, std::vector<uint32_t*>, edgeComparator> q; 

第一個版本聲明瞭一個功能命名q,不帶任何參數,返回std::priority_queue<...>類型的值。

第二個版本聲明瞭變量,其名稱爲q,類型爲std::priority_queue<...>,它是默認初始化的。

+1

謝謝你的迴應!如果這是一個愚蠢的問題,我很抱歉,但我認爲'SomeClass sc();'會不帶任何參數地調用'SomeClass'的構造函數,這不是很平滑嗎?我使用了類似的符號和提供的參數來初始化事物。 – Daeden

+1

您確實使用該語法爲構造函數指定_one或more_參數。但是,當使用_zero_參數時,您不能使用括號。 –

+1

謝謝!這似乎很不一致,但我確信我永遠不會忘記這一點。我只是將它添加到我不喜歡的關於C++ lol的東西列表中。 – Daeden