2012-07-24 66 views
2

我有兩個實例,其中我重載了< <操作符,它始終默認顯示在下面的第一個是否有任何方法可以獲得第二個自定義類Shape的功能?重載操作符的順序

謝謝

約翰

第一個重載:

template <class T> 
    ostream & operator << (ostream & out, vector <T> & vec) 
    { 
     for (unsigned int i = 0;i<vec.size()-1; i++) { 
     out << vec[i] << " "; 
     } 
     out << vec[vec.size() - 1]; 

     return out; 
    } 

第二個重載:

ostream & operator << (ostream & out, vector <Shape> & vec) 
    { 
     for (unsigned int i = 0;i<vec.size(); i++) 
     { 
     out << "##" << vec[i].get_shape_type << i << endl << vec[i] << endl; 
     } 
     return out; 
    } 

編輯7/25/2012:

我加放在t他同一個文件

#ifndef _UTILS_H_ 
    #define _UTILS_H_ 
    #include <iostream> 
    #include <vector> 
    #include <algorithm> 
    #include "Shape.H" 

    using namespace std; 

    template <class T> 
    ostream & operator << (ostream & out, vector <T> & vec) 
    { 
     for (unsigned int i = 0;i<vec.size()-1; i++) { 
      out << vec[i] << " "; 
     } 
     out << vec[vec.size() - 1]; 

     return out; 
    } 

    template <class Shape> 
    ostream & operator << (ostream & out, vector <Shape> & vec) 
    { 
     for (unsigned int i = 0;i<vec.size(); i++) 
     { 
      out << "## " <<vec[i]; 
     } 
     return out; 
    } 
    #endif 

,並試圖編譯和我得到這個錯誤

../include/utils.H:22:11:錯誤:的「模板重新定義的std :: ostream的&操作< < (標準:: ostream的&,性病::矢量&) ' ../include/utils.H:11:11:錯誤:' 模板的std :: ostream的&操作者< <(標準:: ostream的&,性病::矢量&)'此前在此處聲明

+0

[模板專精](https://www.google.ca/search?hl=zh-CN&biw=1920&bih=947&noj=1&gbv=2&sclient=psy-ab&q=template+specialization&oq=template+specialization&gs_l=serp.3..0l10 .10010.12203.0.12507.8.6.0.2.2.0.120.460.5j1.6.0 ... 0.0.SsvzcUdFvpA)。 – chris 2012-07-24 16:23:30

+0

如果您註釋掉模板版本,它是否可以編譯?我懷疑在呼叫點只有模板版本可見。 – 2012-07-24 17:08:30

+1

只要在使用之前聲明第二次重載,就應該有效。你能發佈一個可以展示問題的可編譯程序嗎? – 2012-07-24 17:17:12

回答

0

我不是模板專業化專家。但是,另一種解決方案是修改Shape::operator<<()以包含所有輸出。

1

您的兩個函數具有相同的名稱和簽名。只有模板參數名稱(T,SHAPE)不同。這就是爲什麼編譯器會抱怨你重新定義了同樣的功能。您需要簽名不同或添加std::enable_if

0

你的'重載'基本上是具有不同命名模板參數的函數,因此重新聲明錯誤。你必須讓他們真正的超載。 Shape版本不需要是模板,只是一個功能。你也可能想通過const引用傳遞向量:

ostream & operator << (ostream & out, vector<Shape> const& vec) 
{ 
    for (unsigned int i = 0;i<vec.size(); i++) 
    { 
     out << "## " <<vec[i]; 
    } 
    return out; 
} 
1

我認爲編輯中的專業化語法是錯誤的。要正確執行模板專業化,而不是這樣的:

template <class Shape> 
ostream & operator << (ostream & out, vector <Shape> & vec) 

你需要:

template <> 
ostream & operator << <Shape> (ostream & out, vector <Shape> & vec) 

this ref