std :: ostream_iterator找不到operator <<

Won*_*abo 9 c++ iterator operator-overloading operators

我宣布一个operator<<用于std::pair<int, int>:

std::ostream& operator<<(std::ostream& o, const std::pair<int, int>& p) {
    o << p.first << p.second;
    return o;
}
Run Code Online (Sandbox Code Playgroud)

我想在打印数据时使用此运算符:

std::vector<std::pair<int, int>> data;
std::copy(data.begin(), data.end(), std::ostream_iterator<std::pair<int, int>>(std::cout, "\n"));
Run Code Online (Sandbox Code Playgroud)

但是编译器说,no match for operator<<......我做错了什么?

For*_*veR 9

std::copy找不到对超载operator <<进行std::pairstd命名空间.没有好办法,operator <<std命名空间的算法中重std命名对象.

您可以使用std::for_eachfunctor,它将打印您的值,例如使用lambda.

std::for_each(data.begin(), data.end(), [](const std::pair<int, int>& p)
{
   std::cout << p << std::endl;
});
Run Code Online (Sandbox Code Playgroud)

您无法在std命名空间中进行重载,因此您只能为用户定义的类型添加特殊化

如果C++程序向命名空间std或命名空间std中的命名空间添加声明或定义,则该行为是未定义的,除非另有说明

只有当声明取决于用户定义的类型并且特化符合原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板特化添加到命名空间std.

  • @WonderCsabo你永远不应该在std命名空间中添加东西.标准不允许这样做. (2认同)