1

バイナリ ヒープ実装のメイン ファイルで定義しようとしているメソッドに関して、コンパイラ エラーが発生します。エラーはすべて buildTable のメソッド宣言がある行を参照しており、エラーは次のとおりです。

lab4.cpp:9: error: variable or field ‘buildTable’ declared void
lab4.cpp:9: error: missing template arguments before ‘table’
lab4.cpp:9: error: expected primary-expression before ‘*’ token
lab4.cpp:9: error: ‘tree’ was not declared in this scope
lab4.cpp:9: error: expected primary-expression before ‘prefix’

参照用の私のコードは次のとおりです。

    #include <iostream>
    #include <string>
    #include <map>
    #include <cstring>
    #include "heap.h"
    #include "huffnode.h"
    using namespace std;

    void buildTable(map table, huffnode::huffnode * tree, std::string prefix){
        if(tree->leftChild() == NULL && tree->rightChild() == NULL){
            map[tree.getLetter()] = prefix;
        else{
            buildTable(table, tree->leftChild(), prefix+"0");
            buildTable(table, tree->rightChild(), prefix+"1");
        }
    }

    int main() {

        map<char, int> code; // Constructs map <letter, frequency>
        map<char,int>::iterator it;
        map<char,string>::iterator it2;
        map<char, string> encoding;
        string input;
        getline(cin, input);
        for(int i = 0; i < input.length(); i++){        // build a map from the string
            char currLetter = input[i];
            int exist = code.count(currLetter);
            //cout << exist << endl;
            if(exist == 0){             // check if letter already has a key
                code[currLetter] = 1;
            }else{
                code[currLetter] = code[currLetter] + 1;
            }
            if(currLetter == '.'){
                break;
            }
        }
        heap binHeap;
        for (it=code.begin() ; it != code.end(); it++){             // Fill the heap
            huffnode * newHuff = new huffnode((*it).first, (*it).second);
            cout << newHuff->getLetter() << " => " << newHuff->getFreq() << endl;
            binHeap.insert(newHuff);
        }
        /*
        while(binHeap.getSize() > 0){
            cout << binHeap.extractMin()->getFreq() << endl;

        }
        */

        while(binHeap.getSize() > 1){               // build the tree
            huffnode *newLeft, *newRight;
            newLeft = binHeap.extractMin();
            newRight = binHeap.extractMin();
            huffnode * newInternal = new huffnode(newLeft, newRight);
            binHeap.insert(newInternal);
        }

        huffnode * root = binHeap.extractMin();
        buildTable(encoding, root, "");
        for (it2=encoding.begin() ; it2 != encoding.end(); it2++){              // Fill the heap
            cout <<it2->first  << " => " << it2->second << endl;
        }




    }

パラメータの前に std:: と huffnode:: を付けて、付けずに試してみましたが、どちらも同じエラー メッセージが表示されました。助けてくれてありがとう。

4

2 に答える 2

2

1つの問題は、パラメーター宣言にあります

map table

mapクラスにテンプレートパラメータを提供していません。map何が欠けているかを確認するために使用した他の場所でこれを再確認してください。

于 2012-11-29T23:40:53.497 に答える
2

まず、次のようなものが必要だったと思います。

void buildTable(map<char, string> table, huffnode::huffnode * tree, std::string prefix){
    if(tree->leftChild() == NULL && tree->rightChild() == NULL){
        table[tree->getLetter()] = prefix;
    }
    else{
        buildTable(table, tree->leftChild(), prefix+"0");
        buildTable(table, tree->rightChild(), prefix+"1");
    }
}

そこには多くの修正があります:

  1. map<char, string>(テンプレート引数を指定してください)
  2. map[]->table[]
  3. tree.getLetter()->tree->getLetter()
  4. }他の前に行方不明

コードの残りの部分にも同じくらい多くの問題があると確信しています。(etc?)huffnodeの定義が欠落しているため、わかりません。heap

大きな本文を書き込んでから一度にコンパイラーにスローするのではなく、ゆっくりとコードを記述し、コンパイラーにすべてのステップをチェックさせることをお勧めします

また、私はhuffnode次のような定義を想定しました。

namespace huffnode 
{ 
    struct huffnode 
    { 
        huffnode *leftChild();
        huffnode *rightChild(); 
        char getLetter(); 
    }; 
}
于 2012-11-29T23:45:13.260 に答える