2013-12-18 62 views
1

我試圖這樣做:重載「opeator <<」的容器類型與C++模板類++

template <class T> 
ostream& operator<<(ostream& ou, map<T,T> x) { 
    for(typename map<T,T>::iterator it = x.begin(); it != x.end(); it++) { 
     ou << it->first << ": " << it->second << endl; 
    } 
    return ou; 
} 

我測試了它在主:

int main() { 
    map<char, int> m; 
    m['a']++; 
    m['b']++; 
    m['c']++; 
    m['d']++; 

    cout << m << endl; 
} 

然後我得到了錯誤:

'error: no match for 'operator<<' in 'std::cout << m'

,如果我改變了函數的參數從map<T,T>到重載操作員工作10。我的代碼中是否存在一個小問題,或者是否有完全不同的方式來執行此操作?一般來說,如何使用模板類爲容器類型重載運算符?

+0

你定義爲使用相同類型的鍵和值地圖的模板,但您要在地圖輸出具有兩種不同類型的鍵和值 – clcto

回答

8

您的運營商只對其中關鍵的類型和映射類型是相同的地圖(如std::map<int,int>std::map<char,char>

你需要兩個模板參數:

template <class K, class V> 
std::ostream& operator<<(std::ostream& ou, const map<K,V>& x) { .... } 

編輯:請注意,沒有理由複製map,所以我修改了運營商取而代之的const參考。

2

您的模板論據說,地圖中的關鍵和價值是相同的。嘗試改變這一點:

template <class T> 

這樣:

template <typename T1, typename T2> 

,然後更新這些新T1的和T2的代碼的其餘部分。

2

你已經做了一個模板class T但應該改爲爲兩類:

template <class T, class U> 
ostream& operator<<(ostream& ou, map<T,U> x) { 
    for(typename map<T,U>::iterator it = x.begin(); it != x.end(); it++) { 
     ou << it->first << ": " << it->second << endl; 
    } 
    return ou; 
}