运算符<< ....的未定义引用是什么意思?在c ++中

时间:2012-11-22 09:24:47

标签: c++ class function friend

我在课堂上有朋友的功能。 (在头文件.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是另一个操纵数据库条目的类

2 个答案:

答案 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