簡體   English   中英

如何為模板類重載<< cout?

[英]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任何私有成員。 現在看來, NODETYPEdouble ,因此不需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM