c++友元种,友元函数

c++友元类,友元函数
#ifndef _BST_H_HITHUMING_INCLUDE_
#define _BST_H_HITHUMING_INCLUDE_
#include<iostream>
using namespace std;
template<class T>
class node
{
public:
    node():lchild(NULL),rchild(NULL) {};
    node(T p)
    {
        this->data=p;
        lchild=NULL;
        rchild=NULL;
    };
    ~node()
    {
        delete this;
    };
    void setup(T d,node<T>* l,node<T> r)
    {
        data=d;
        lchild=l;
        rchild=r;
    };
    T return_data()
    {
        return data;
    };
    node<T>* return_lc()
    {
        return lchild?lchild:NULL;
    };
    node<T>* return_rc()
    {
        return rchild?rchild:NULL;
    };
    friend class BST;//声明啦友元类,为什么下面还不能访问?
private:
    T data;
    node<T>* lchild,rchild;
};
template <class T>
class  BST
{
public:
    void CreateBST();//返回父节点的指针
    void InsertBST(T key,node<T>* F);//插入的类型,还有插入的位置
    node<T>* SearchBST(T key,node<T>* F);//查找
    void in_order(node<T>* t);
    node<T>* return_rt();
private:
    node<T>* root;
};
template <class T>
void BST<T>::CreateBST()
{
    root=NULL;
    T m;
    while(cin >> m&&m!='#')
        InsertBST(m,root);
}
template <class T>
void BST<T>::InsertBST(T key,node<T>* F)
{
    if(F==NULL)
    {
//        F=new node<T>;
        F.setup(key,NULL,NULL);
    }
    else if (key<F.return_data())
        InsertBST(key,F.return_lc());
    else if (key > F.return_data())
        InsertBST(key,F.return_rc());
    else return;
}
template <class T>
node<T>* BST<T>::SearchBST(T k,node<T>* F)
{
    node<T>* p =F;
    if (p== NULL || k == p.return_data() ) /* 递归终止条件*/
        return p;
    if ( k < p.return_data())