Я работаю над классом дерева двоичного поиска, и у меня возникли проблемы с кодированием перегруженной функции оператора потоковой передачи. Вот мой код … Я сделал все, что мне удалось найти в Интернете (и в точках зрения моего профессора), поэтому я понятия не имею, что я делаю неправильно.
* Отредактировано несколько секунд назад, чтобы обновить изменения в моем коде. Решил вызвать функцию из объекта, отправляемого другу, который имеет код, аналогичный тому, который был в функции друга …
Соответствующие заголовки в заголовочном файле (файл .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);
}
}
Я бы опубликовал ошибки компилятора, но они продолжаются довольно много строк, и я чувствую, что проблемы очевидны. Буду обновлять с ними, правда, если кому захочется!
Поскольку вы не перечислили сообщения об ошибках или даже не указали тип вашей проблемы, вам трудно помочь. Однако я попытался заполнить некоторые пробелы, чтобы повторить вашу проблему и обнаружил пару проблем с кодом:
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;
using namespace std;
, увидеть Почему "используя пространство имен std" считается плохой практикой?.С этими изменениями код, созданный для меня как clang, так и g ++.
Других решений пока нет …