ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?

ostream_iterator operator= fails on pair<int,int>, but works on wrapper class. Can't I overload operator<< for pair<>?

本文关键字:lt gt int 运算符 不能 重载 工作 失败 iterator pair ostream      更新时间:2023-10-16

我正在尝试使用 stl 习语来打印对向量的内容,方法是为对定义运算符<<,除非我使用包装类,否则它失败了:

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
}

迭代器:974:28:二进制表达式的操作数无效('std::__1::ostream_iterator、char、std::__1:::char_traits>::ostream_type'(又名'basic_ostream>'(和'const std::__1::p air'(

_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&(。那是因为它在全局命名空间中而不是在std命名空间中吗?

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

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

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