【问题标题】:overloading operator<< for set重载操作符<< 用于集合
【发布时间】:2015-10-09 21:35:26
【问题描述】:

我有一组整数对,我想打印它,所以我重载了

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)

我不知道是什么问题,错误非常神秘。此外,如果我创建一组整数并打印它,它就可以正常工作。

【问题讨论】:

    标签: c++ vector set operator-overloading


    【解决方案1】:

    auto it = s.begin() 中的it 的类型是const_iterator(source)。因此,当您调用 os&lt;&lt;*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 &amp; for

    1. 您可以将临时绑定到 const &amp;(前函数返回)

    2. 您不应该在输出期间修改容器,因此这将使用 C++ 类型系统来强制执行。

    【讨论】:

    • 谢谢,实际上,当我为vector(而不是set)写这个时,它起作用了,这就是我感到困惑的原因。
    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多