C++类模版无法编译

求助:C++类模版无法编译。
我是在数据结构与算法分析一书中摘抄的算法。但是我编译不过去。可能是我C++基础不够好,所以没解决这个问题、
希望前辈帮助C++类模版无法编译


这部分是头文件的中的声明
#ifndef _Binary_Search_Tree
#define _Binary_Search_Tree

template <typename Comparable>
class BinarySearchTree
{
public:
BinarySearchTree();
BinarySearchTree(const BinarySearchTree & rhs);
~BinarySearchTree();

const Comparable & findMin() const;
const Comparable & findMax() const;
bool contains(const Comparable & x) const;
bool isEmpty() const;
void printTree() const;

void makeEmpty();
void insert(const Comparable & x);
void remove(const Comparable & x);

const BinarySearchTree & operator=(const BinarySearchTree & rhs);

private:
struct BinaryNode
{
Comparable element;
BinaryNode *left;
BinaryNode *right;

BinaryNode(const Comparable & theElement, BinaryNode *lt, BinaryNode *rt)
: element(theElement), left(lt), right(rt) { }
};

BinaryNode *root;

void insert(const Comparable & x, BinaryNode * & t) const;
void remove(const Comparable & x, BinaryNode * & t) const;
BinaryNode * findMin(BinaryNode *t) const;
BinaryNode * findMax(BinaryNode *t) const;
bool contains(const Comparable & x, BinaryNode *t) const;
void makeEmpty(BinaryNode * & t);
void printTree(BinaryNode *t) const;
BinaryNode * clone(BinaryNode *t) const;
};
#include  "E:\VSAPP\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp"
#endif // !_Binary_Search_Tree

这部分是实现
#include "stdafx.h"
#include "BinarySearchTree.h"

template <typename Comparable>
bool BinarySearchTree<Comparable>::contains(const Comparable & x) const
{
return contains(x, root);
}

template <typename Comparable>
void BinarySearchTree<Comparable>::insert(const Comparable & x)
{
insert(x, root);
}

template <typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x)
{
remove(x, root);
}

template <typename Comparable>
bool BinarySearchTree<Comparable>::contains(const Comparable & x, BinaryNode * t) const
{
if ( t == NULL)
{
return false;
}
else if (x < t->element)
{
return contains(x, t->left);
}
else if
{
return contains(x, t->right)
}
else
return true;
}

template <typename Comparable>
BinaryNode * BinarySearchTree<Comparable>::findMin(BinaryNode * t) const
{
if (t == NULL)
{
return NULL;
}
if (t->left == NULL)
{
return t;
}
return findMin(t->left);
}

template <typename Comparable>
BinaryNode * BinarySearchTree<Comparable>::findMax(BinaryNode *t) const
{
if ( t != NULL)
{
while ( t->right != NULL)
{
t = t->right;
}
}
return t;
}

template <typename Comparable>
void BinarySearchTree<Comparable>::insert(const Comparable & x, BinaryNode * & t)
{
if (t == NULL)
{
t = new BinaryNode(x, NULL, NULL);
}
else if (x < t->element)
{
insert(x, t->left);
}
else if (t->element < x)
{
insert(x, t->right);
}
else
;
}

template <typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x, BinaryNode * & t)
{
if (t == NULL)
{
return;
}

if ( x < t->element)
{
remove(x, t->left);
}
else if( t->element < x)
{
remove(x, t->right);
}
else if (t->left != NULL && t->right != NULL)
{
t->element = findMin(t->right)->element;
remove(t->element, t->right);
}
else
{
BinaryNode * oldNode = t;
t = (t->left != NULL) ? t->left : t->right;
delete oldNode;
}
}

/**
* Destructor for the tree
*/
template <typename Comparable>
BinarySearchTree<Comparable>::~BinarySearchTree()
{
makeEmpty();
}
/**
* Internal method to make subtree empty.
*/
template <typename Comparable>
void BinarySearchTree<Comparable>::makeEmpty(BinaryNode * & t)
{
if (t != NULL)
{
makeEmpty(t->left);
makeEmpty(t->right);
delete t;
}
t = NULL;
}

/**
* Deep copy.
*/
template <typename Comparable>
const BinarySearchTree & BinarySearchTree<Comparable>::operator=(const BinarySearchTree & rhs)
{
if (this != &rhs)
{
makeEmpty();
root = clone(rhs.root);
}
return *this;
}

/**
* Internal method to clone subtree.
*/
template <typename Comparable>
BinaryNode * BinarySearchTree<Comparable>::clone(BinaryNode *t) const
{
if (t == NULL)
return NULL;

return new BinaryNode(t->element, clone(t->left), clone(t->right));
}


这是提示的错误
1>------ 已启动生成:  项目: ConsoleApplication9, 配置: Debug Win32 ------
1>  BinarySearcTree.cpp
1>e:\vsapp\consoleapplication9\consoleapplication9\binarysearctree.cpp(42): error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1>e:\vsapp\consoleapplication9\consoleapplication9\binarysearctree.cpp(42): error C2065: “Comparable”: 未声明的标识符
1>e:\vsapp\consoleapplication9\consoleapplication9\binarysearctree.cpp(42): error C2923: “BinarySearchTree”: 对于参数“Comparable”,“Comparable”不是有效的 模板 类型变量
1>e:\vsapp\consoleapplication9\consoleapplication9\binarysearctree.cpp(53): error C2509: “findMin”: 成员函数没有在“BinarySearchTree”中声明
1>          e:\vsapp\consoleapplication9\consoleapplication9\binarysearchtree.h(6) : 参见“BinarySearchTree”的声明
1>e:\vsapp\consoleapplication9\consoleapplication9\binarysearctree.cpp(53): fatal error C1903: 无法从以前的错误中恢复;正在停止编译

========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
------解决思路----------------------
得写 binarynode 的全名

typename BinarySearchTree<Comparable>::BinaryNode

另外类模板不要分开写,成员定义和类模板定义写在一个文件里。
------解决思路----------------------
BinaryNode是类型成员,在类外使用,得这样

template <typename Comparable>
typename BinarySearchTree<Comparable>::BinaryNode * BinarySearchTree<Comparable>::clone(BinaryNode *t) const
{
if (t == NULL)
return NULL;

return new BinaryNode(t->element, clone(t->left), clone(t->right));
}

其它类似处理

------解决思路----------------------
//#include "stdafx.h"
#include "bst.h"

template <typename Comparable>
bool BinarySearchTree<Comparable>::contains(const Comparable & x) const
{
return contains(x, root);
}

template <typename Comparable>
void BinarySearchTree<Comparable>::insert(const Comparable & x)
{
insert(x, root);
}

template <typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x)
{
remove(x, root);
}

template <typename Comparable>
bool BinarySearchTree<Comparable>::contains(const Comparable & x, BinaryNode * t) const
{
if ( t == NULL)
{
return false;
}
else if (x < t->element)
{
return contains(x, t->left);
}
else if
{
return contains(x, t->right)
}
else
return true;
}

template <typename Comparable>
typename BinarySearchTree<Comparable>::BinaryNode * BinarySearchTree<Comparable>::findMin(BinaryNode * t) const
{
if (t == NULL)
{
return NULL;
}
if (t->left == NULL)
{
return t;
}
return findMin(t->left);
}

template <typename Comparable>
typename BinarySearchTree<Comparable>::BinaryNode * BinarySearchTree<Comparable>::findMax(BinaryNode *t) const
{
if ( t != NULL)
{
while ( t->right != NULL)
{
t = t->right;
}
}
return t;
}


template <typename Comparable>
void BinarySearchTree<Comparable>::insert(const Comparable & x, BinaryNode * & t) const
{
if (t == NULL)
{
t = new BinaryNode(x, NULL, NULL);
}
else if (x < t->element)
{
insert(x, t->left);
}
else if (t->element < x)
{
insert(x, t->right);
}
else
;
}


template <typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x, BinaryNode * & t) const
{
if (t == NULL)
{
return;
}

if ( x < t->element)
{
remove(x, t->left);
}
else if( t->element < x)
{
remove(x, t->right);
}
else if (t->left != NULL && t->right != NULL)
{
t->element = findMin(t->right)->element;
remove(t->element, t->right);
}
else
{
BinaryNode * oldNode = t;
t = (t->left != NULL) ? t->left : t->right;
delete oldNode;
}
}

/**
* Destructor for the tree
*/
template <typename Comparable>
BinarySearchTree<Comparable>::~BinarySearchTree()
{
makeEmpty();
}
/**
* Internal method to make subtree empty.
*/
template <typename Comparable>
void BinarySearchTree<Comparable>::makeEmpty(BinaryNode * & t)
{
if (t != NULL)
{
makeEmpty(t->left);
makeEmpty(t->right);
delete t;
}
t = NULL;
}

/**
* Deep copy.
*/
template <typename Comparable>
const BinarySearchTree<Comparable> & BinarySearchTree<Comparable>::operator=(const BinarySearchTree & rhs)
{
if (this != &rhs)
{
makeEmpty();
root = clone(rhs.root);
}
return *this;
}

/**
* Internal method to clone subtree.
*/
template <typename Comparable>
typename BinarySearchTree<Comparable>::BinaryNode * BinarySearchTree<Comparable>::clone(BinaryNode *t) const
{
if (t == NULL)
return NULL;

return new BinaryNode(t->element, clone(t->left), clone(t->right));
}


这样就可以了.