我在课堂上有朋友的功能。 (在头文件.head.h中)我在head.cpp中实现了 在课堂外的head.h中我有ostream&运营商LT;< (ostream& out,TreeNode * ptr); 我也在head.cpp中实现了。这有什么问题吗?
标头文件
friend ostream& operator<< (ostream& out, const TreeDB& ptr);
ostream& operator<< (ostream& out, TreeNode* ptr);
实施
ostream& operator<< (ostream& out, TreeNode* ptr)
{
if(rhs!=NULL)
{
operator<<(out,ptr->Left());
out<<(*(ptr->Entry()));
operator<<(out,ptr->Right());
}
return out;
}
ostream& operator<< (ostream& out, const TreeDB& ptr)
{
return (operator<<(out,ptr.root));
}
错误:对'operator&lt;&lt;(std :: basic_ostream&gt;&amp;,DBentry const&amp;)'的未定义引用
DBentry是另一个操纵数据库条目的类
答案 0 :(得分:2)
您的全局TreeDB打印功能在您的班级定义(我们假设)中被称为:
friend ostream& operator<< (ostream& out, const TreeDB& ptr);
您稍后将其定义为
ostream& operator<< (ostream& out, const TreeDB& ptr)
{
return (operator<<(out,ptr.root));
}
注意: ptr
是const;因此ptr.root
也是常量
现在看一下你的节点指针运算符:
ostream& operator<< (ostream& out, TreeNode* ptr)
ptr
不是const,因此该运算符不适用。它应该是:
ostream& operator<< (ostream& out, const TreeNode* ptr)
一旦你解决了这个问题。您的错误消息:
错误:对'operator&lt;&lt;(std :: basic_ostream&gt;&amp;,DBentry const&amp;)'的未定义引用
这几乎可以肯定是因为您没有以下内容:
ostream& operator <<(ostream& os, const DBEntry& entry);
很有可能如果你有这样的运算符,它没有在右侧声明const
限定符,就像你没有正确声明const TreeNode*
一样它的operator <<()
。
答案 1 :(得分:1)
当你得到一个未定义的引用时,它通常是缺少函数定义的一个症状,签名与声明的签名差别很小,或者函数的定义没有被编译/链接。
因此请检查您的参数是否匹配,命名空间是否匹配,以及函数的定义是否确实已编译。
据我所知,您提供的代码中没有定义运算符&lt;&lt; DBEntry& const
。