ostream_iterator operator =在pair <int,int>上失败,但在包装器类上有效。我不能重载operator <<为pair <>吗?

时间:2019-11-24 23:48:49

标签: c++ templates stl iterator ostream

我正在尝试通过使用stl惯用法来为成对的向量定义内容,方法是为该对定义operator <<,否则它将失败,除非使用包装类:

typedef pair<int, int> P;
// Dump wrapper, just converting implicitly pair<int, int> to PC.
class PC { public: int first; int second; PC(const P& p) { first = p.first; second = p.second;}};

ostream& operator<<(ostream& o, const PC& v) {
    return o << "(" << v.first << "," << v.second << ")";
}

ostream& operator<<(ostream& o, const P& v) {
    return o << "(" << v.first << "," << v.second << ")";
}

int main(int argc, const char * argv[]) {
    P p = {10,20};
    cout << p; // works
    *ostream_iterator<PC>(cout, ", ") = p; // works
    *ostream_iterator<P>(cout, ", ") = p; // fails, error msg below
}

iterator:974:28:无效的二进制表达式操作数('std :: __ 1 :: ostream_iterator,char,std :: __ 1 :: char_traits> :: ostream_type'(aka'basic_ostream>')和'const std: :__ 1 :: pair')

_LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_)
    {
        *__out_stream_ << __value_; //// <<<---- Here is the error line
        if (__delim_)
            *__out_stream_ << __delim_;
        return *this;
    }

似乎找不到我的运算符<<(ostream&o,const P&)。是因为它在 global 命名空间中,而不是在 std 命名空间中?

1 个答案:

答案 0 :(得分:2)

std::pair<int,int>不同,PC不是从全局名称空间输入的,因此您的 operator<<重载不参与重载解析。 如果您在命名空间std中定义它,则可能会起作用:

namespace std {
    ostream& operator<<(ostream& o, const P& v) {
        return o << "(" << v.first << "," << v.second << ")";
    }  
}

但这是不正确的,因为pair<int,int>不依赖于任何用户定义的类型。您最好使用包装器。