不用多说,就是下面的代码:
#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<<()
.
UPDATE:
我的第三个建议是使用自定义操纵器来打印这对。
至于我的第二个建议,如果你可以使用C++11,继承自std::pair
应该很容易(未经测试):
struct PAIR : std::pair
{
using std::pair::pair;
};
如果您无法使用 C++11,那么我建议使用自定义操纵器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)