.h不能通过,.cpp却通过了

qinken547 2010-09-14 04:19:36

BinaryTree.h
#ifndef BINARYTREE_H_INCLUDED
#define BINARYTREE_H_INCLUDED


#include <iostream>

using namespace std;


template<class T>
struct BTNode
{
BTNode(){ lChild=rChild=NULL;}
BTNode(const T& x)
{
element=x; lChild=rChild=NULL;
}
BTNode(const T& x, BTNode<T>* l,BTNode<T>* r)
{
element=x; lChild=l; rChild=r;
}
T element;
BTNode<T>* lChild, *rChild;
};



template<class T>
void Visit(T& x)
{
cout<<x<<" ";
}

template <class T>
class BinaryTree
{
public:
BinaryTree(){root=NULL;}
~BinaryTree(){};
protected:
BTNode<T>* root;
public:
bool Root(T& x)const;
void MakeTree(const T& x, BinaryTree<T> & left, BinaryTree<T> & right);
void PreOrder(void (*Visit)(T& x));
private:
void PreOrder(void (*Visit)(T& x),BTNode<T>* t);
public:
//void Clear(void);
};


#endif // BINARYTREE_H_INCLUDED


BinaryTre.cpp
/*
** Copyright (C) QPSOFT.COM All rights reserved.
*/

#include "BinaryTree.h"

//template <class T>
//BinaryTree<T>::~BinaryTree()
//{
//}

template<typename T>
bool BinaryTree<T>::Root(T& x)const
{
if(root){
x=root->element; return true;
}
else return false;
}

template<typename T>
void BinaryTree<T>::MakeTree(const T& x, BinaryTree<T>& left, BinaryTree<T>& right)
{
if(root||&left==&right) return;
root=new BTNode<T>(x,left.root, right.root);
left.root=right.root=NULL;
}

template <class T>
void BinaryTree<T>::PreOrder(void (*Visit)(T& x))
{
PreOrder(Visit,root);
}


template <class T>
void BinaryTree<T>::PreOrder(void (*Visit)(T& x),BTNode<T>* t)
{
if (t){
Visit(t->element);
PreOrder(Visit,t->lChild);
PreOrder(Visit,t->rChild);
}
}


main.cpp
#include "BinaryTree.h"

void main(void)
{
BinaryTree<char> a,b,x,y,z;
y.MakeTree('E',a,b);
z.MakeTree('F',a,b);
x.MakeTree('C',y,z);
y.MakeTree('D',a,b);
z.MakeTree('B',y,x);
z.PreOrder(Visit);
x.PreOrder(Visit); y.PreOrder(Visit);
}



main函数中用BinaryTree.h就出现如下错误:
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall BinaryTree<char>::PreOrder(void (__cdecl*)(char &))" (?PreOrder@?$BinaryTree@D@@QAEXP6AXAAD@Z@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall BinaryTree<char>::MakeTree(char const &,class BinaryTree<char> &,class BinaryTree<char> &)" (?MakeTree@?$BinaryTree@D@@QAEXABDAAV1@1@Z) referenced in function _main
1>D:\c++\hfm\Debug\hfm.exe : fatal error LNK1120: 2 unresolved externals

用.cpp却运行正常,在VS2008和CODEBLOCKS中都试过,都出现这样的问题...

...全文
62 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
模板的声明与定义 必须在同一个文件里面
qinken547 2010-09-14
  • 打赏
  • 举报
回复
OK,多谢楼上的,结贴不解释.....
冻结 2010-09-14
  • 打赏
  • 举报
回复
现在的编译器,基本不支持模板的分离编译。
冻结 2010-09-14
  • 打赏
  • 举报
回复
模板要放在一个文件中,可以都放在.h文件中。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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