0

我在课堂上有朋友功能。(在头文件中。head.h)我已经在head.cpp和head.h中实现了类外我有ostream& operator<< (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<<(std::basic_ostream >&,DBentry const&)' 的引用

DBentry 是另一个操作数据库条目的类

4

2 回答 2

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也是 const

现在看看你的节点指针运算符:

ostream& operator<< (ostream& out, TreeNode* ptr)

ptr不是 const,因此该运算符不适用。它应该是:

ostream& operator<< (ostream& out, const TreeNode* ptr)

一旦你解决了这个问题。你的错误信息:

错误:未定义对 'operator<<(std::basic_ostream >&,DBentry const&)' 的引用

这几乎可以保证是因为您没有以下内容:

ostream& operator <<(ostream& os, const DBEntry& entry);

如果您确实有这样的运算符,则很有可能它没有const在右侧使用限定符声明,就像您const TreeNode*在其operator <<().

于 2012-11-22T09:48:04.243 回答
1

当你得到一个未定义的引用时,它通常是缺少函数定义的症状,签名与定义和声明的微小差异,或者函数的定义没有编译/链接。

因此,请检查您的参数是否匹配,名称空间是否匹配,以及函数的定义是否确实已编译。

据我在您提供的代码中看到的,您尚未定义 operator<< for DBEntry& const

于 2012-11-22T09:29:33.343 回答