2012-11-22 61 views
0

我在课堂上有朋友的功能。 (在头文件head.h中)我已经在head.cpp 和head.h以外的类中实现了我有ostream &运算符< <(ostream & out,TreeNode * ptr);我也在head.cpp中实现了。那有什么问题吗?未定义的运算符<< ....是指什么?在c + +

头文件

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)); 
} 

错误:未定义参照 '操作符< <(标准:: basic_ostream> &,DBentry常量&)'

DBentry是另一类操纵数据库条目

+6

为什么不告诉我们你的实际代码而不是描述它? – NPE

+1

您将得到“未定义的引用...“链接器的错误消息,它可以表明你链接你的项目时错过了一个文件 –

+0

,因为我不认为这个错误是由于逻辑错误而发生的,它关于声明部分的一些东西 – user1722022

回答

1

当你有一个未定义的引用它往往是要么缺少的函数定义,自定义和声明或函数的定义不编译/中联的签名差异小的症状。

因此检查你的参数是否匹配,名称空间是否匹配,以及函数的定义是否真的被编译。

据我所知,在您提供的代码中,您没有为DBEntry& const定义运算符< <。

+0

friend ostream&operator <<(ostream&out,const TreeDB & rhs); ostream&operator <<(ostream&out,TreeNode * rhs);这些在我的头文件 – user1722022

+0

中,这些是我的实现部分ostream&operator <<(ostream&out,TreeNode * rhs) {rhs!= NULL) { operator <<(out,rhs-> getLeft()); out <<(*(rhs-> getEntry())); 运营商<<(out,rhs-> getRight()); } 退货; } ostream的&运算<<(ostream的进出,常量树形菜单&右) { 返回(操作者<<(下,rhs.root)); } – user1722022

+1

@ user1722022更新你的代码到你的问题而不是作为这里的评论 – billz

2

您的树形菜单打印全局函数在类定义friended(我们假设)为:

friend ostream& operator<< (ostream& out, const TreeDB& ptr); 

你以后把它定义为

ostream& operator<< (ostream& out, const TreeDB& ptr) 
{ 
    return (operator<<(out,ptr.root)); 
} 

注意:ptr是常量;因此ptr.root是常量以及

现在看看你的节点指针操作:

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

ptr不是const的,因此这种操作并不适用。它应该是:

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

一旦你修好了。您的错误信息:

Error: undefined reference to 'operator<<(std::basic_ostream >&,DBentry const&)'

这几乎肯定是因为你没有做如下:

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

如果你有这样的未与申报的经营者非常有可能在右侧的const限定符与您在operator <<()中未正确声明const TreeNode*的方式相同。

+0

我增加了const,但它再次显示相同的错误。 – user1722022

+0

现在它编译,但从我的程序输出是 0x9bc61380x9bc61000x9bc6158> – user1722022

+0

那些将是指针值。至少你正在取得进展。我个人会抛弃除了常量TreeDB&和也许DBEntry操作符以外的所有操作符,而是为每个需要转储到输出流的类实现'write(ostream&)const;'成员,但是编译错误是固定的,所以这是一件好事。 – WhozCraig