2012-07-25 37 views
0

我正在使用指針向量來釋放堆中的一系列節點對象。該矢量具有所有節點對象地址,並且有一個函數delete_nodes,該函數與for_each循環一起用於刪除矢量中的所有節點。出於某種原因,我得到了Eclipse CDT的用的for_each循環以下錯誤紅色下劃線:for_each調用將無法使用指針向量

error: no matching function for call to 'for_each(__gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, __gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, <unresolved overloaded function type>)' 

代碼爲霍夫曼編碼和循環的for_each是在最後。 nodes_delete向量是在while循環之前創建的。

void Huff::delete_nodes(Node*n){//this is used to delete all the nodes in the binary tree at the end of Huff::compress() 
    delete n; 
} 
vector<Code>* Huff::compress(){ 
    //-------GETTING WEIGHTS/FREQUENCIES------ 
    vector<Node *>* nodes = new vector<Node*>; // Vector of nodes for later use 
    map<char, int>* freq = new map<char, int>; // Map to find weight of nodes 
    for(unsigned int i = 0; i < content.length(); i++) 
     (*freq)[content[i]]++; 
    CopyTo copyto(nodes); //sets vector<Node*> to copy to 
    for_each(freq->begin(), freq->end(), copyto); // Copies 
    delete freq; 
    vector<Node *>::iterator beg = nodes->begin(); 

    //-------SETTING UP TO BUILD TREE------ 
    if(nodes->size() % 2 == 1){ //makes sure there are an even number of nodes 
     Node* fill = new Node; 
     fill->set_node(0, '*', NULL, NULL); 
     nodes->push_back(fill); 
    } 
    huff_sort(nodes); // sort nodes by weight 
    vector<Node*> nodes_delete(*nodes); //this is used to delete all the nodes in the binary tree at the end 
    //-------BUILDING TREE------ 
    while(nodes->size() != 1){ //Sorts nodes by weight and then removes two of them and replaces them with one 
     int w= (**beg).weight + (**(beg+1)).weight; 
     Node* p = new Node; 
     p->set_node(w, '*', *nodes->begin(), *(nodes->begin()+1)); //making it the parent node of the two lowest nodes 
     nodes->erase(nodes->begin(), nodes->begin()+2); 
     unsigned int i = 0; 
     while(w > (*nodes)[i]->weight && i <= nodes->size()){ //finds where to insert the parent node based on weight 
      i++; 
     } 
     if(i > nodes->size()) //if it needs to be inserted at the end 
      nodes->push_back(p); 
     else 
      nodes->insert(nodes->begin()+i, p); 
    } 
    //-------TRAVERSING TREE------ 
    Node* root = (*nodes)[0]; 
    delete nodes; 
    vector<Code>* codes = new vector<Code>; 
    traverse(root, codes , ""); 
    delete root; 
    for_each(nodes_delete.begin(), nodes_delete.end(), delete_nodes); 
    return codes; 
} 
+0

「delete_nodes」函數是否有多個(重載)定義?在上面的代碼中,我只能看到一個,但是您是否檢查過是否存在另一個,也許在一個頭文件中? – jogojapan 2012-07-25 01:58:48

+0

@jogojapan就我所知,沒有其他的delete_nodes。另外,如果我將delete_nodes的名稱更改爲其他任何名稱,則錯誤仍然存​​在。 – 2012-07-25 02:02:00

+0

順便說一句我假設'delete_nodes'函數被定義爲一個靜態成員函數。這實際上是正確的嗎?如果不是的話,下面的Matteo Italia是正確的(儘管我發現編譯器的錯誤消息在這種情況下會引起誤導)。 – jogojapan 2012-07-25 02:02:44

回答

3

它看起來像你的delete_nodes是一個非靜態成員函數。如果是這樣,您不能僅使用delete_nodes作爲std::for_each的參數。 std::for_each需要一個仿函數。你的delete_nodes不是一個函子。

首先,要獲取指向非靜態成員函數的指針,總是需要&運算符和一個限定名稱。非靜態成員函數的名稱(僅爲delete_nodes)在C++中不是有效的表達式。你必須做&Huff::delete_nodes。其次,指向成員函數的指針(而不是指向「普通」函數的指針)不是函子。爲了把它變成一個仿函數,你可以使用std::mem_fun函數。這會給你一個二進制仿函數,因爲std::mem_fun會將隱含的this參數變成一個明確的參數。爲了將它變成std::for_each所需的一元仿函數,您必須將第一個參數綁定到特定的對象指針值(可能是?this?)。

以上步驟的最終結果將如下

bind1st(mem_fun(&Huff::delete_nodes), this) 

這是一個一元仿函數,對於this對象調用delete_nodes

所以,for_each呼叫你的例子應該如下

for_each(nodes_delete.begin(), nodes_delete.end(), 
    bind1st(mem_fun(&Huff::delete_nodes), this)); 

然而,它看起來就像在你執行delete_nodes可以變成一個靜態成員函數。靜態成員函數是一個「普通」函數,這意味着它是一個函數,它可以直接使用。即如果您使delete_nodes靜態您的代碼應該按原樣工作。

決定您希望遵循的路徑並進行必要的更改。

3

您試圖通過作爲函數傳遞一個無界限的成員函數。您必須使用例如std::mem_fnbind