[英]How to overload << cout for a template class?
前几天我们被教过如何重载cout,以使我们的程序可以cout,但是我不知道如何使它输出所有内容。
template <NODETYPE>
friend ostream &operator <<(ostream &, List<NODETYPE>& );
template<typename NODETYPE>
ostream &operator <<(ostream& output, List<NODETYPE>& value)
{
output << value;
return output;
}
但是,我的程序至少要输出5个对象,其中两个是double。 我收到一个错误消息,说“ double不是模板常量参数的有效类型”
我的两个问题是:如何输出所有对象,而不仅仅是第一个对象; 以及如何获得双倍输出。 请和谢谢!
编辑:巨大的编辑:::
好的,我意识到自己做错了事,重新排列了标题和源文件。
然后我也意识到,错过讲师的课是我犯过的最大的错误之一。 我的下一个错误是给您我所有的假设,而不是我所假设的信息。
在我的作业中,它说:•编写一个作业运算符和一个朋友函数来输出链接列表。
在我的主要功能的几乎所有其他行中(不允许更改的功能),都有一个提示:
List<int> Li, Li2, Li3;
List<double> Ld, Ld2;
这些是我的对象。 我所有的提示看起来都是这样的:
cout << "Ld is: " << Ld << endl;
重新排列头文件和源文件后,出现以下错误:“在'std :: operator << [with_Traits = std :: char_traits](((std :: basic_ostream>&)(& std :: cout)),(((const char *)'Ld is“))<
我得到的每条关于cout的陈述都可以理解。 它的信息比Ld退出状态为1或其他任何信息都多,所以我从这里开始。
我仍然不太热衷于使用此ostream重载功能,因此感谢您的帮助,并非常感谢您的宝贵时间!
编辑:: -
我已经将几乎所有代码都写在了这篇文章中: collect2:Ld返回了1退出状态构建make错误
如果有人可以帮助我解决超载问题,那是很棒的,因为我认为这是我唯一剩下的问题,因此我可以找出其他所有问题。
谢谢!!
您需要对List<NODETYPE>
执行某种迭代,以打印出每个节点。 否则,您将具有无限递归,操作员会自行调用。
本示例在一行中打印出用单个空格分隔的元素。 由于我不了解您的List
接口,因此省略了迭代机制的详细信息。
template<typename NODETYPE>
ostream &operator <<(ostream& output, const List<NODETYPE>& value)
{
for ( node in value) // pseudocode iteration
{
output << node << " ";
}
return output;
}
假定节点类型有一个ostream& operator<<
,否则就不必提供该值。 另外,请注意我通过const reference
传递列表。 这有很多优点,其中之一就是您可以传递临时对象。
关于friend
声明,那里也需要template<typename T>
,但尚不清楚您首先需要运算符成为friend
。 列表通常在其公共界面中提供对其元素的访问。
List<T>
的operator<<
应该遍历列表中每个T
类型的元素,并调用output << element;
在每一个上。
然后,确保您创建List<T>
对象所使用的每个类型T
还实现了一个operator<<
,它以您希望的格式输出您想要的每个变量,例如output << "(" << x << "," << y << ")"
。 内置类型已经可以执行此操作,因此例如List<int>
将不需要此步骤。
1)不需要friend
声明,除非要用作模板参数的NODETYPE
是您自己定义的类, 并且要定义的operator<<
想要访问NODETYPE
任何私有成员。 现在看来, NODETYPE
是double
,因此不需要friend
声明。
如果您要使用其他数据类型作为模板参数,而这些其他数据类型是您自己的类,则在这些类中放置一个friend
声明。 (这对于List
类型可能是正确的,如下所述)。
2)现在,您的operator<<
是递归的。 您必须(按照其他答案的建议)以某种方式遍历所获得的NODETYPE
对象的列表:
for(List::const_iterator it = value.begin() ; it != value.end() ; ++it)
output << *it;
(以上假设,您的List
数据类型实现了begin()
, end()
和iterators。您可能希望使用另一种方式遍历List
的元素。为此,您实际上可能必须访问List
私有成员。数据类型,在这种情况下,您必须在List
类定义中声明operator<<
作为朋友模板(包括typename
!)。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.