Оператор перегрузки << для шаблонного класса

Я пытаюсь реализовать метод для двоичного дерева, которое возвращает поток. Я хочу использовать поток, возвращенный в методе, чтобы показать дерево на экране или сохранить дерево в файле:

Эти два метода находятся в классе двоичного дерева:

Объявления:

void streamIND(ostream&,const BinaryTree<T>*);
friend ostream& operator<<(ostream&,const BinaryTree<T>&);

template <class T>
ostream& operator<<(ostream& os,const BinaryTree<T>& tree) {
    streamIND(os,tree.root);
    return os;
}

template <class T>
void streamIND(ostream& os,Node<T> *nb) {
    if (!nb) return;
    if (nb->getLeft()) streamIND(nb->getLeft());
    os << nb->getValue() << " ";
    if (nb->getRight()) streamIND(nb->getRight());
}

Этот метод находится в классе UsingTree:

void UsingTree::saveToFile(char* file = "table") {
    ofstream f;
    f.open(file,ios::out);
    f << tree;
    f.close();
}

Поэтому я перегрузил оператор «<<» класса BinaryTree для использования: cout << tree и ofstream f << tree, но я получаю следующее сообщение об ошибке: неопределенная ссылка на `operator << (std :: basic_ostream> &, BinaryTree &)»

Постскриптум В дереве хранятся объекты Word (строка с целым числом).

Я надеюсь, что вы понимаете мой плохой английский. Спасибо! И я хотел бы знать хороший текст для начинающих о STL, который объясняет все необходимое, потому что я трачу все свое время на ошибки, подобные этой.

РЕДАКТИРОВАТЬ: дерево в saveToFile () объявляется: BinaryTree <Word> дерево.

Ответы на вопрос(4)

Ваш ответ на вопрос