关于类模板的友元的问题
在重写《数据结构:思想和实现》书中二叉树链接实现部分代码时遇到,基本是照抄的书上代码,使用codeBlock运行时出现问题。
代码(分为cpp文件,头文件和主文件)
btree.h
#ifndef btree_h
#define btree_h
template<class T>
class btree
{
public:
//省略
};
template<class T>
class binaryTree:public btree<T>
{
friend void printTree(const binaryTree<T> &t,T flag); //在这里申明了友元
private:
struct node
{
T data;
node *right,*left;
node(T x,node *R=NULL,node *L=NULL):data(x),right(R),left(L){}
node():right(NULL),left(NULL){}
~node(){}
};
node *root;
public:
//省略
private:
//省略
};
#endif
binaryTree.cpp(函数实现写在此cpp文件中)
#include<iostream>
#include"btree.h"
#include"linkQueue.cpp"
using namespace std;
//友元函数定义
template<class T>
void printTree(const binaryTree<T> &t, T flag)
{
linkQueue<T> q;
q.enQueue(t.root->data);
cout<<endl;
while(!q.isEmpty())
{
T p,l,r;
p=q.deQueue();
l=t.lchild(p,flag);
r=t.rchild(p,flag);
cout<<p<<' '<<l<<' '<<r<<endl;
if(l!=flag) q.enQueue(l);
if(r!=flag) q.enQueue(r);
}
}
main.cpp
#include <iostream>
#include "binaryTree.cpp"
using namespace std;
int main()
{
binaryTree<char> tree;
printTree(tree,'@'); //在此调用此函数
return 0;
}
运行结果及报错内容
显示此函数没有被定义。
我的解答思路和尝试过的方法
尝试过将此函数的实现写到main函数中,但出现相同的报错信息。
但通过如下修改可以正常运行:
void printTree(const binaryTree<char> &t, char flag)
{
linkQueue<char> q;
q.enQueue(t.root->data);
cout<<endl;
while(!q.isEmpty())
{
char p,l,r;
p=q.deQueue();
l=t.lchild(p,flag);
r=t.rchild(p,flag);
cout<<p<<' '<<l<<' '<<r<<endl;
if(l!=flag) q.enQueue(l);
if(r!=flag) q.enQueue(r);
}
}
也就是没有用函数模板。
我想要达到的结果
请问使用函数模板时报错的原因是什么呢?