2

前几天我们被教导如何让我们的程序重载 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 不是模板常量参数的有效类型”

我的两个问题是:如何输出所有对象而不仅仅是第一个对象;以及如何让双倍输出。请和谢谢!

编辑:巨大的编辑:::

好的,我意识到我做错了什么,重新排列了我的标题和源文件。

然后我也意识到错过讲师的课是我犯过的最大错误之一。我的下一个错误是给你我所有的假设,而不是我假设的信息。

在我的作业中,它说: • 编写一个赋值运算符和一个友元函数来输出链表。

在我的主要功能(我不允许更改的功能)的几乎所有其他行中,都有一个 cout:

List<int> Li, Li2, Li3;
List<double> Ld, Ld2;

这些是我的对象。我所有的 couts 看起来都是这样的:

  cout << "Ld is: " << Ld << endl;

重新排列我的头文件和源文件后,我得到了这个错误:“'std::operator<<[with_Traits = std::char_traits] 中的'operator<<'不匹配(((std :: basic_ostream>&)(& std::cout)), ((const char*) 'Ld 是"))<

对于我拥有的每一个 cout 声明,我都会明白这一点。它比 Ld 退出状态为 1 或其他信息更多,所以我从这里开始。

我仍然不完全热衷于使用这个 ostream 重载功能,所以任何帮助表示赞赏,并非常感谢您抽出宝贵的时间!

编辑:: -

我已经把我几乎所有的代码都放在了这篇文章中:collect2: Ld returned 1 exit status build make error

如果有人可以帮助我解决超载问题,那就太好了,因为我认为这是我剩下的唯一问题,所以我可以弄清楚其他所有问题。

谢谢!!

4

3 回答 3

1

您需要对 执行某种迭代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。列表通常在其公共界面中提供对其元素的访问。

于 2012-09-20T05:23:38.370 回答
0

1)friend声明是不必要的,除非NODETYPE您想用作模板参数是您自己定义的类,并且您正在定义的想要operator<<访问NODETYPE. 现在看来,NODETYPEis double,所以不需要friend声明。

如果您想将其他数据类型用作模板参数,并且这些其他数据类型是您自己的类,请这些类中放置一个friend声明。(这可能是正确的类型,如下所述)。List

2)现在,你operator<<是递归的。您必须(如其他答案所建议的那样)以某种方式遍历NODETYPE您获得的对象列表:

for(List::const_iterator it = value.begin() ; it != value.end() ; ++it)
  output << *it;

(以上假设,您的List数据类型实现begin()end()和迭代器。您可能希望使用不同的方式来遍历 的元素List。为此,您实际上可能必须访问List数据类型的私有成员,在这种情况下,您必须声明类定义中的operator<<作为朋友模板(包括typename!)List。)

于 2012-09-20T05:37:51.723 回答
0

List<T>'soperator<<应该遍历T列表中每个类型的元素并调用每个元素output << element;

然后,确保T您创建List<T>对象的每种类型也实现了一个operator<<,它以您希望的格式输出您想要的每个变量,例如output << "(" << x << "," << y << ")". 内置类型已经执行此操作,因此例如List<int>不需要此步骤。

于 2012-09-20T05:25:53.603 回答