前几天我们被教导如何让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
如果有人可以帮助我解决那些过重的问题,因为我认为这是我唯一能解决的问题,所以我可以弄清楚其他一切。
谢谢!
答案 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
的任何私人成员。现在看来,NODETYPE
是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
!) {1}}类定义。)