明明声明了,却说是未声明的标识符

icetcn 2003-05-01 09:09:13
是哈夫曼算法的程序:
源代码如下:
//////////////////////////////////////////////////////////////////////////
//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” : 未声明的标识符
...全文
1142 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SwordMan2001 2003-05-01
  • 打赏
  • 举报
回复
模板类必须被包含进使用它的源文件中,原因上面两位已经说了

至于"我以前也写过模板类的程序,都是定义和实现分开放的,为什么又能很好的编译通过呢?"
你可能是包含了相应的 *.cpp 的文件了吧.
icetcn 2003-05-01
  • 打赏
  • 举报
回复
请问micropentium6(小笨) ,难道只要使用模板类,类的实现就一定要放在头文件里吗?
为什么?我以前也写过模板类的程序,都是定义和实现分开放的,为什么又能很好的编译通过呢?
本人不才,请指教。也请 scklotz(晓春)指点一二:)
scklotz 2003-05-01
  • 打赏
  • 举报
回复
///////////////////////////////////////////////////////////////////////
#include "Huffman.h"
#include "Huffman.cpp"
void main()
{
int a[7] = {0,9,11,13,3,5,12};
BTree<int> ht = HuffmanTree(a,6);
}

编译器必须知道模板的实现代码,才能够实例化模板。
  • 打赏
  • 举报
回复 1
又是这个答过无数遍的问题:请把你的实现写在头文件里,这是必须的,因为你使用了摸板类!:)

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧