2009-06-14 127 views
0

有什麼辦法創建一個函數來接受任何版本的給定 模板類?使用模板類作爲參數

例如這個工程:

ostream& operator << (ostream &out,const Vector<int>& vec); 

但這並不:

ostream& operator << (ostream &out,const Vector& vec); 

是否有可能得到第二行以某種方式爲載體的任何版本的工作? 例如vector<int>vector<double>而不必編寫2個單獨的功能?

加質疑:

我做運算< <模板功能,就像你建議。爲了使向量類我嘗試添加下列到Vector類定義的一個朋友的功能,但它沒有工作:

friend ostream& operator << (ostream &out, const Vector<T>& vec); 

可以做些什麼來解決它的任何想法?

+2

如果不編輯班級的定義(並在那裏指定友誼),則無法讓某個功能成爲班級的朋友。 你可以指定你想要完成的操作符,它需要它是一個朋友功能嗎?你可能不需要友誼。 – 2009-06-14 05:52:59

回答

1

正如早已指出這樣的事情應該工作:

template <typename T> 
ostream& operator << (ostream &out,const Vector<T>& vec) { 
    // body here 
} 

至於朋友的要求,這是最容易處理像這樣:

template <typename T> 
ostream& operator << (ostream &out,const Vector<T>& vec) { 
    vec.print_on(out); 
    return out; 
} 

但是,通常我會想到像這樣的輸出運算符,需要訪問類的內部才能在您的類Vector中顯示錯誤。它真的只需要使用公共接口來進行顯示。

的另一件事是,你可能還需要到模板的輸出流本身,這樣就可以保留其類型:

template <typename O, typename C, typename T> 
std::basic_ostream<O, C>& operator << (std::basic_ostream<O, C> &out,const Vector<T>& vec) { 
    vec.print_on(out); 
    return out; 
} 

Vectorprint_on仍然可以使用ostream

+0

+1。你對運營商<<()通常不需要成爲朋友也是對的。 – 2009-06-14 10:50:39

5

當然,使它成爲一個模板函數:

template <typename T> 
ostream& operator << (ostream &out,const Vector<T>& vec); 
+1

值得注意的是,你必須最有可能內聯功能體以及 – 2009-06-14 05:03:46

2
template <class T> 
ostream& operator << (ostream &out,const Vector<T>& vec);