作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究二叉搜索树类,但在编写重载流式运算符函数时遇到了问题。这是我的代码...我已经完成了我设法在网上找到的所有内容(以及在我教授的幻灯片中),所以我不知道我做错了什么。
*几秒钟前编辑以更新对我的代码的更改。决定从发送到 friend 的对象调用函数,该对象具有与 friend 函数中的代码相似的代码...
头文件(.h文件)中的相关头文件:
friend ostream& operator<<(ostream& out, const BST& tree);
void leveltraversal(ostream& out);
头文件(.h 文件)中的相关“私有(private)”数据/嵌套类:
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<<
的符号缺失错误,这很可能是因为模板 friend 很狡猾。参见 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;
, 请参阅 Why is "using namespace std" considered bad practice? .通过这些更改,我使用 clang 和 g++ 构建的代码都很好。
关于c++ - 友元函数中的 STL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13227461/
我是一名优秀的程序员,十分优秀!