如何重载<< cout用于模板类?

时间:2012-09-20 05:13:01

标签: c++ linked-list double overloading cout

前几天我们被教导如何让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个对象要输出,其中两个是双打。我得到一个错误,上面写着&#39; double不是模板常量参数的有效类型&#39;

我的两个问题是:如何输出所有对象而不仅仅是第一个对象;以及如何获得双输出。拜托,谢谢!

编辑:巨大的编辑:::

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

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

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

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

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

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

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

重新排列标题和源文件后,我收到此错误: &#34;不匹配&#39;运营商&lt;&lt;&#39; in&#39; std :: operator&lt;&lt; [with_Traits = std :: char_traits](((std :: basic_ostream&gt;&amp;)(&amp; std :: cout)),((const char *)&#39 ; Ld是&#34;))&lt;

我得到的每一个cout声明都有。它比Ld退出状态为1或其他更多的信息,所以我就是这样做的。

我还没有完全热衷于使用这个ostream重载功能,所以任何帮助都非常感谢,非常感谢您的时间!

EDIT :: -

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

如果有人可以帮助我解决那些过重的问题,因为我认为这是我唯一能解决的问题,所以我可以弄清楚其他一切。

谢谢!

3 个答案:

答案 0 :(得分: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<<,如果不是,您也必须提供。{p>另外,请注意我通过const reference传递列表。这有许多优点,其中之一就是你可以传递临时对象。

关于friend声明,您还需要template<typename T>,但目前尚不清楚首先需要运算符为friend。列表通常提供对其公共界面中元素的访问。

答案 1 :(得分:0)

List<T>的{​​{1}}应该遍历列表中operator<<类型的每个元素,并在每个元素上调用T

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

答案 2 :(得分:0)

1)friend声明是不必要的,除非您要用作模板参数的NODETYPE是您自己定义的类, operator<<您正在定义想要访问NODETYPE的任何私人成员。现在看来,NODETYPEdouble,因此不需要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!) {1}}类定义。)