ostream_iterator operator= 在 pair<int,int> 上失败,但在 wrapper class 上有效。我不能为 pair<> 重载 operator<< 吗?
ostream_iterator operator= fails on pair<int,int>, but works on wrapper class. Can't I overload operator<< for pair<>?
我正在尝试使用 stl 习语来打印成对向量的内容,方法是为成对定义运算符 <<,但它失败了,除非我使用包装器 class:
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::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;
}
似乎找不到 my operator<<(ostream&o, const P&)。那是因为它在 global 命名空间中而不是在 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>
不依赖于任何用户定义的类型。你使用包装器是个更好的主意。
我正在尝试使用 stl 习语来打印成对向量的内容,方法是为成对定义运算符 <<,但它失败了,除非我使用包装器 class:
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::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;
}
似乎找不到 my operator<<(ostream&o, const P&)。那是因为它在 global 命名空间中而不是在 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>
不依赖于任何用户定义的类型。你使用包装器是个更好的主意。