明明声明了,却说是未声明的标识符
是哈夫曼算法的程序:
源代码如下:
//////////////////////////////////////////////////////////////////////////
//Huffman.h
//////////////////////////////////////////////////////////////////////////
#ifndef _HUFFMAN_H_
#define _HUFFMAN_H_
#include "BTree.h"
template <class T>
class Huffman
{
public:
operator T() const {return weight;} //重载类型转换操作符
private:
BTree <int> tree;
T weight;
friend BTree <int> HuffmanTree(T[], int);
};
#endif
//////////////////////////////////////////////////////////////////////////
//HuffmanTree.cpp
//////////////////////////////////////////////////////////////////////////
#include "Huffman.h"
#include "PriorityQueue.h"
template <class T>
BTree <int> HuffmanTree(T a[], int n)
{
Huffman <T> *w = new Huffman <T>[n+1];
BTree <int> z, zero;
for(int i = 1; i <= n; i++) //根据a[]构造单结点数的数组
{
z.MakeTree(i,zero,zero);
w[i].weight = a[i];
w[i].tree = z;
}
PriorityQueue <Huffman <T> > pq;
for(i = 1; i <= n; i++) //由w建成最小堆优先权队列pq
pq.Insert(w[i]);
Huffman <T> x,y; //x , y为Huffman<T>类对象
for(i = 1; i<= n; i++) //将队列中的二叉树不断合并
{
pq.Delete(x); //从队列中删去两个优先权最高的树
pq.Delete(y); //分别赋给x , y
z.MakeTree(0, x.tree, y.tree); //将对象x , y的两棵二叉树合并成一棵二叉树z
x.weight += y.weight; //使对象x的权值为x和y的权值之和
x.tree = z; //对象x中包含二叉树z
pq.Insert(x); //将对象x插入到pq
}
pq.Delete(x); // 从pq中取出x,并从中删除
delete []w;
return x.tree; //最后的哈夫曼树为x.tree
}
///////////////////////////////////////////////////////////////////////
#include "Huffman.h"
void main()
{
int a[7] = {0,9,11,13,3,5,12};
BTree<int> ht = HuffmanTree(a,6);
}
////////////////////////////////////////////////////
d:\Huffman\Main.cpp(7): error C2065: “HuffmanTree” : 未声明的标识符