2015-07-20 170 views
1

我有一組整數對的,我想打印出來,所以我重載< <運營商設定和對類如:重載運算符<<爲集

template<typename T, typename U> 
inline ostream& operator<<(ostream& os, pair<T,U> &p){ 
    os<<"("<<p.first<<","<<p.second<<")"; 
    return os; 
} 


template<typename T> 
inline ostream& operator<<(ostream& os, set<T> &s){ 
    os<<"{"; 
    for(auto it = s.begin() ; it != s.end() ; it++){ 
     if(it != s.begin()) 
      os<<","; 
     os<<*it; 
    } 
    os<<"}"; 
    return os; 
} 

當我創建了一套和輸出像

set<pair<int,int>> s; 
cout<<s<<endl; 

它給人的錯誤:

cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ 
    os<<*it; 

initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::pair<int, int>]’ 
    operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) 

我不知道是什麼問題,錯誤很神祕。此外,如果我創建一組整數並打印它,它工作正常。

回答

5

auto it = s.begin()類型的itconst_iteratorsource)。因此當您撥打os<<*it;時,您需要一個可以使用const 對的功能。如果你改變你的代碼到這一點,將工作:

#include <iostream> 
#include <set> 
#include <utility> 

using namespace std; 

template<typename T, typename U> 
inline ostream& operator<<(ostream& os, const pair<T,U> &p){ 
    os<<"("<<p.first<<","<<p.second<<")"; 
    return os; 
} 


template<typename T> 
inline ostream& operator<<(ostream& os, const set<T> &s){ 
    os<<"{"; 
    for(auto it = s.begin() ; it != s.end() ; it++){ 
     if(it != s.begin()) 
      os<<","; 
     os<<*it; 
    } 
    os<<"}"; 
    return os; 
} 

int main() 
{ 
    set<pair<int,int>> s {{1,2}}; 
    cout<<s<<endl; 
} 

Live Example

我也建議你總是拿第二個參數爲const &

  1. 可以綁定一個臨時到const &(ex函數返回)

  2. 您不應該在修改容器時輸出,所以這使用C++類型系統來執行。

+0

謝謝,實際上,當我爲矢量(而不是集合)寫這個,它工作,這就是爲什麼我感到困惑。 –

2

流操作符並不是要修改它們傳遞的值。因此,你應該接受一個const引用,而不是一個可變參考:

template<typename T, typename U> 
inline ostream& operator<<(ostream& os, const pair<T,U> &p){ 
    os<<"("<<p.first<<","<<p.second<<")"; 
    return os; 
} 


template<typename T> 
inline ostream& operator<<(ostream& os, const set<T> &s){ 
    os<<"{"; 
    for(auto it = s.begin() ; it != s.end() ; it++){ 
     if(it != s.begin()) 
      os<<","; 
     os<<*it; 
    } 
    os<<"}"; 
    return os; 
}