gpt4 book ai didi

c++ - 为什么 ostream_iterator 没有按预期工作?

转载 作者:可可西里 更新时间:2023-11-01 15:45:58 25 4
gpt4 key购买 nike

下面的代码就不用多说了:

#include <utility>
#include <vector>
#include <iostream>
#include <iterator>

using namespace std;

typedef pair<char, char> PAIR;

ostream& operator <<(ostream& os, const PAIR& r)
{
return os << r.first;
}

int main()
{
vector<PAIR> coll;

cout << coll[0]; // OK.

// The following line will cause a compilation error! Why???
copy(coll.begin(), coll.end(), ostream_iterator<PAIR>(cout));
}

最佳答案

问题是名称查找没有找到您的 operator<<(ostream& os, const PAIR& r) .尝试调用 operator<< 的代码在ostream_iterator<>里面的某个地方它本身在 std 中命名空间。名称查找在 ostream_iterator<> 中四处寻找正确的函数和 std命名空间;参数依赖查找在这里没有帮助,因为两个参数都在 std 中命名空间也是如此。

因此,我的建议是 (1) 要么将您的运算符包装到 namespace std { } 中,但那是 UB,IIRC。或者 (2) 创建一个继承自 std::pair 的结构在您的命名空间中定义一个新类型,并使用 ADL 查找您的 operator<<() .

更新:

我的第三个建议是使用自定义操纵器打印出这对。

至于我的第二个建议,如果你可以使用 C++11,继承自 std::pair应该很容易(未经测试):

struct PAIR : std::pair
{
using std::pair::pair;
};

如果您不能使用 C++11,那么我建议使用自定义操纵器。

关于c++ - 为什么 ostream_iterator 没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4447827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com