Operador de sobrecarga << para una clase de plantilla

Estoy tratando de implementar un método para un árbol binario que devuelve una secuencia. Quiero usar la secuencia devuelta en un método para mostrar el árbol en la pantalla o para guardar el árbol en un archivo:

Estos dos métodos están en la clase del árbol binario:

Declaraciones:

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());
}

Este método está en la clase UsingTree:

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

Entonces sobrecargué el operador "<<" de la clase BinaryTree para usar: cout << tree y ofstream f << tree, pero recibo el siguiente mensaje de error: referencia no definida a `operator << (std :: basic_ostream> &, Árbol binario&)'

PD El árbol almacena objetos de Word (una cadena con un int).

Espero que entiendas mi pobre inglés. ¡Gracias! Y me gustaría saber un buen texto para principiantes sobre STL que explique todo lo necesario porque pierdo todo mi tiempo en errores como este.

EDITAR: el árbol en saveToFile () se declara: BinaryTree <Word> tree.

Respuestas a la pregunta(4)

Su respuesta a la pregunta