我有这段代码,但我不明白它是如何工作的:
#include <iostream>
#include <vector>
#include <iterator>
#include <utility>
typedef std::pair<int, double> elem_t;
std::ostream& operator<<(std::ostream& os, elem_t p)
{
return os << p.first << ',' << p.second;
}
int main()
{
std::vector<elem_t> v(10);
std::cout << v[0] << '\n';
std::copy(v.begin(), v.end(), std::ostream_iterator<elem_t>(std::cout, " "));
return 0;
}
当
std::copy(v.begin(), v.end(), std::ostream_iterator<elem_t>(std::cout, " "));
行被注释时,它工作得很好,但是当它没有被注释时,我会遇到很多磨损和错误。这条线的工作方式有什么区别?
std::cout << v[0] << '\n';
std::copy(v.begin(), v.end(), std::ostream_iterator<elem_t>(std::cout, " "));
我尝试研究命名空间和重载 << operator, but i still don't get the mechanics of ostream_iterator and why it's not compiling without errors.
为您不“拥有”的类型(即不包含任何用户类型)编写运算符函数是一个坏主意。
std::pair<int, double>
和 std::ostream
仅在 std
命名空间中具有类型(int
和 double
没有任何关联的命名空间)。当编译器在输出到 operator<<
时尝试查找要输出的 std::ostream_iterator
时,在全局命名空间中找不到它(请参阅:https://en.cppreference.com/w/cpp/language/adl )
如果您使用自己的类型之一:
struct elem_t : std::pair<int, double> {
using pair::pair;
};
std::ostream& operator<<(std::ostream& os, elem_t p)
{
return os << p.first << ',' << p.second;
}
...它会工作得很好,因为
operator<<
和 elem_t
是在同一命名空间中定义的(并且可以通过 ADL 找到它)