[英]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.