Проблема с STL в функции «Друг»

Я работаю над классом дерева двоичного поиска, и у меня возникли проблемы с кодированием перегруженной функции оператора потоковой передачи. Вот мой код … Я сделал все, что мне удалось найти в Интернете (и в точках зрения моего профессора), поэтому я понятия не имею, что я делаю неправильно.

* Отредактировано несколько секунд назад, чтобы обновить изменения в моем коде. Решил вызвать функцию из объекта, отправляемого другу, который имеет код, аналогичный тому, который был в функции друга …

Соответствующие заголовки в заголовочном файле (файл .h):

friend ostream& operator<<(ostream& out, const BST& tree);

void leveltraversal(ostream& out);

Соответствующие «частные» данные / вложенные классы в заголовочном файле (файл .h):

private:
class BinNode {
public:
T data;
BinNode* left;
BinNode* right;
BinNode() : left(NULL), right(NULL) {}
BinNode (T item): data(item), left(NULL), right(NULL) {}
};

typedef BinNode* BinNodePtr;
BinNodePtr myRoot;

Соответствующие реализации файловых функций:

ostream& operator<<(ostream& out, const BST& tree)
{
tree.leveltraversal(out);
return out;
}

template <typename T>
void BST<T>::leveltraversal(ostream& out)
{
int level = 0;
BinNodePtr temp = myRoot;
queue<BinNodePtr> nodes;
nodes.push(temp);
out << endl << endl;
while (!nodes.empty()){
temp = nodes.front();
level = recursive_level(temp->data);
out << endl << endl;
out << "Node data: " << temp->data;
out << endl;
out << "Level: " << level;
nodes.pop();
if (temp->left)
nodes.push(temp->left);
if (temp->right)
nodes.push(temp->right);
}
}

Я бы опубликовал ошибки компилятора, но они продолжаются довольно много строк, и я чувствую, что проблемы очевидны. Буду обновлять с ними, правда, если кому захочется!

2

Решение

Поскольку вы не перечислили сообщения об ошибках или даже не указали тип вашей проблемы, вам трудно помочь. Однако я попытался заполнить некоторые пробелы, чтобы повторить вашу проблему и обнаружил пару проблем с кодом:

  • Если вы видите ошибку отсутствующего символа для operator<<, это, вероятно, потому что шаблонные друзья хитры. Увидеть http://www.parashift.com/c++-faq/template-friends.html; самый простой обходной путь — определить функцию внутри объявления класса:
template <typename T>
class BST {
...
friend std::ostream& operator<<(std::ostream& out, const BST& tree)
{
tree.leveltraversal(out);
return out;
}
  • В operator<< вы берете const BST& tree (это означает, что вы не можете изменить исходный объект через эту ссылку), поэтому leveltraversal функция также должна быть объявлена const, Вы не можете позвонить неconst функция-член на const объект; если позволено, это позволит вам изменить объект, ломая constНесс.
void leveltraversal(std::ostream& out) const;

С этими изменениями код, созданный для меня как clang, так и g ++.

0

Другие решения

Других решений пока нет …