在重写《数据结构:思想和实现》书中二叉树链接实现部分代码时遇到,基本是照抄的书上代码,使用codeBlock运行时出现问题。
#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
#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);
}
}
#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);
}
}
也就是没有用函数模板。
请问使用函数模板时报错的原因是什么呢?
类里的友元还是比较复杂的,首先不要把类声明和类实现放在两个函数里,你可以引入.cpp文件或者把类的声明实现放在一起把该头文件后缀名改为.hpp;然后类模板中,类内声明类外实现的友元函数你首先要加作用域啊,然后实现需要写在最上面,空说难以理解,给你分享一下我写的博客吧
http://t.csdn.cn/iZFE8
在binary类声明之前加上:
template<class T> class binaryTree;
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);
}
}
同时把类内友元声明:
friend void printTree(const binaryTree &t,T flag);
改为:
friend void printTree<>(const binaryTree &t,T flag);