2014-01-31 63 views
-1

我有一個名爲「KeyedCollection」的模板類,其中包含將數據插入向量以及流出數據的函數。該矢量是一個私人成員函數。我似乎無法弄清楚如何在我的重載ostream朋友函數中使用這個向量中的信息。注意:我不能改變類和函數參數的一般結構,它們必須保持原樣。我列出了所有的課程供參考,但有問題的功能是最後一個。在ostream中使用向量重載朋友函數

#include "stdafx.h" 
#include <iostream> 
#include <vector> 
#include "Windows.h" 
#include <string> 

using namespace std; 

template <class K, class T> 
class KeyedCollection { 
public: 
    // Create an empty collection 
    KeyedCollection(); 

    // Return the number of objects in the collection 
    int size() const; 

    // Insert object of type T with a key of type K into the 
    // collection using an 「ignore duplicates」 policy 
    void insert(const K&, const T&); 

    // Output data value of objects in the collection, 
    // one data value per line 
    friend ostream& operator<<(ostream&, 
          const KeyedCollection&); 

private: 
    // Insert required members here 
     int objSize; 
vector<T> objects; 

}; 

template<class K, class T> 
KeyedCollection<K,T>::KeyedCollection() { 

objSize = 0; 
vector<T> objects; 
} 

template<class K, class T> 
int KeyedCollection<K,T>::size() const { 

    objSize = objects.size(); 

return objSize; 
} 

template<class K, class T> 
void KeyedCollection<K,T>::insert(const K&,const T& c) { 

objects.push_back(c); 

} 
// !!! function i am trying to define !!! 
template<class K, class T> 
ostream& operator<<(ostream& outstream,const KeyedCollection<K,T>& inst) { 

outstream<<inst<<endl; 

return outstream; 
} 

而且,我收到說

「致命錯誤LNK1120:1周無法解析的外部」 錯誤

和一個寫着

「錯誤LNK2019:無法解析的外部符號」 class std :: basic_ostream> & __cdecl operator < <(class std :: basic_ostream> &,class KeyedCollection const &)「(?? 6 @ YAAAV?$ basic_ost令@杜?$ @ char_traits @ d性病性病@@@ @@ AAV01 @ ABV?$ @ KeyedCollection HVCustomer @@@@@ Z)函數_main」引用...

正如一個側面的問題,任何想法這些可能是什麼?

+0

朋友''<<進級的車身,並沒有錯誤消失或移動實施了不同的一個被取代? – Yakk

+0

好吧我試過,但我不認爲我做得正確...你會定義功能 的ostream&KeyedCollection ::運算符<<(ostream的&outstream,常量KeyedCollection &研究所){ \t outstream <<出師表<< ENDL; 返回外流; } – jordpw

+0

在課堂上。在'friend'聲明結尾處的';'放置一個'{'然後寫入主體,然後放入一個'}'。換行符可選。 – Yakk

回答

0

cppreferenceJohannes Schaub - litb都提供了相同的方法來使其工作。

您希望將該模板的一個單一實例(稱爲「專業化」 通用術語)作爲朋友。你這樣做以下方式 [...]

一類的定義之前做一個向前聲明:

template <class K, class T> class KeyedCollection; 

template<class K, class T> 
ostream& operator<<(ostream& outstream,const KeyedCollection<K,T>& inst); 

由於編譯器從參數列表知道模板 的論點是T和U,你不必把它們放在< ...>之間,所以 它們可以留空。

然後,讓你的朋友聲明,一定要加<>operator<<

template <class K, class T> 
class KeyedCollection { 
public: 

// snip 

friend ostream& operator<< <> (ostream& outstream,const KeyedCollection<K,T>& inst); 

// snip 

}; 

最後,你可以把它定義:

template<class K, class T> 
ostream& operator<<(ostream& outstream,const KeyedCollection<K,T>& inst) { 

// Just an example 
for (const auto& t : inst.objects) 
{ 
    std::cout << t << std::endl; 
} 

return outstream; 
} 

Live Example


或者,做什麼Yakk建議。

template <class K, class T> 
class KeyedCollection { 
public: 

// snip 

friend ostream& operator<<(ostream& outstream,const KeyedCollection<K,T>& inst) { 

for (const auto& t : inst.objects) 
{ 
    std::cout << t << std::endl; 
} 

return outstream; 
} 

// snip 

}; 

Live Example

+0

這有助於!它實際上只運行一次,但是......它導致了堆棧溢出。有什麼你可以想到在這個代碼會導致這一點? – jordpw

+0

@jordpw嗯,我想不管是什麼原因導致stackoverflow將在你的'main'代碼中,因爲在現場示例中不會出現stackoverflow。 – 2014-01-31 04:07:16

+0

好吧,我改變了主程序的部分,並且工作。謝謝你的幫助。 – jordpw