VC++ 6.0 complier complaining of ambiguous symbol and calls when i overload this function:

ostream& operator<<(ostream &os, BTreeNode& rBTN)

Source file:

#include <iostream.h>
#include <iomanip.h>
#include "BSTree.h"

using namespace std;


BTreeNode::BTreeNode(int v)
{
value=v;
left=0;
right=0;
}
int BTreeNode::getValue()
{
return value;
}
BTreeNode* BTreeNode::getLeft()
{
return left;
}
BTreeNode* BTreeNode::getRight()
{
return right;
}
BTreeNode** BTreeNode::getLeftAddr()
{
return &left;
}
BTreeNode** BTreeNode::getRightAddr()
{
return &right;
}
// complains about this overloading function!
ostream& operator<<(ostream &os, BTreeNode& rBTN)
{

os << setfill(0)<<"node: "<< setw(6) << &rBTN
<<"value: "<< setw(5) << rBTN.getValue()
<<"left: "<< setw(6) << rBTN.getLeft()
<<"right: "<< setw(6) << rBTN.getRight();

return os;
}



BTree::BTree()
{
root=0;
}

void BTree::insert(int val)
{
insert(val, &root);
}

void BTree::insert(int val, BTreeNode **bT)
{
if(*bT==0)
{
*bT=new BTreeNode(val);
if(bT==0)
{
cout<<"something majorly wrong here";
}
}
else if(val<(*bT)->getValue())
{
insert(val, (*bT)->getLeftAddr());
}
else if(val>(*bT)->getValue())
{
insert(val, (*bT)->getRightAddr());
}
}

int BTree::find(int val)
{
return find(val, root);
}

int BTree::find(int val, BTreeNode *bT)
{
int rtrn=FALSE;

if(bT==0)
{}
else if(val<(bT)->getValue( ))
{
rtrn=find(val, (bT)->getLeft( ));
}
else if(val>(bT)->getValue( ))
{
rtrn=find(val, (bT)->getRight( ));
}
else
{
rtrn=TRUE;
}
return rtrn;
}

void BTree:reOrder()
{
preOrder(root);
}
void BTree:reOrder(BTreeNode *bT)
{
if(bT!=0)
{
cout<<bT->getValue();
preOrder(bT->getLeft( ));
preOrder(bT->getRight( ));
}
else
cout<<"bT is equal to 0";
}
void BTree::inOrder()
{
inOrder(root);
}
void BTree::inOrder(BTreeNode *bT)
{
if(bT!=0)
{

inOrder(bT->getLeft( ));
cout<<bT->getValue()<<"\n";
inOrder(bT->getRight( ));
}
}
void BTree:ostOrder()
{
postOrder(root);
}
void BTree:ostOrder(BTreeNode *bT)
{
if(bT!=0)
{

postOrder(bT->getLeft( ));
postOrder(bT->getRight( ));
cout<<bT->getValue();
}
else
cout<<"bT is equal to 0";
}

header file:

#include <iomanip>


#ifndef BSTree_H
#define BSTree_H
//declare BTreeNode as a class

const FALSE = 0;
const TRUE = 1;

class BTreeNode
{
//public data
public:
BTreeNode(int);
int getValue();
BTreeNode* getLeft();
BTreeNode* getRight();
BTreeNode** getLeftAddr();
BTreeNode** getRightAddr();


//private data
private:
int value;
BTreeNode* left;
BTreeNode* right;
};
class BTree
{
public:
BTree();
void insert(int);
int find(int);
void preOrder();
void inOrder();
void postOrder();
//BTreeNode *root;


private:
BTreeNode *root;

void insert(int, BTreeNode**);
int find(int, BTreeNode*);
void preOrder(BTreeNode*);
void inOrder(BTreeNode*);
void postOrder(BTreeNode*);
};

#endif