我正在使用二进制搜索树类,并且在编写重载的流操作符函数时遇到问题。这是我的代码......我已经完成了我在网上找到的所有内容(以及我教授的权力点),所以我不知道我在做什么错。
*几秒前编辑,以更新我的代码更改。决定调用从被发送到朋友的函数,该朋友具有与朋友函数中相似的代码...
头文件(.h文件)中的相关标头:
friend ostream& operator<<(ostream& out, const BST& tree);
void leveltraversal(ostream& out);
相关&#34;私人&#34;头文件(.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);
}
}
我发布了编译器错误,但是它们会持续很多行,我觉得问题是不言而喻的。但是,如果有人愿意的话,会与他们一起更新!
答案 0 :(得分:0)
由于您没有列出错误消息,甚至没有说明您遇到的问题类型,因此很难提供帮助。但是我试图填写一些空白来复制你的问题,并发现代码有几个问题:
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
ness。void leveltraversal(std::ostream& out) const;
using namespace std;
,请参阅Why is "using namespace std" considered bad practice?。通过这些更改,我可以使用clang和g ++编写代码。