为什么拥有<< operator in a global namespace?

问题描述 投票:0回答:1

我有这段代码,但我不明白它是如何工作的:

#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.

c++ namespaces operator-overloading
1个回答
0
投票

为您不“拥有”的类型(即不包含任何用户类型)编写运算符函数是一个坏主意。

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 找到它)

© www.soinside.com 2019 - 2024. All rights reserved.