不用说以下代码:
#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)); }
解决方法
问题是名称查找找不到您的运算符<(ostream& os,const PAIR& r).尝试调用运算符的代码<<在ostream_iterator<>内的某处它本身就在std命名空间内.名称查找在ostream_iterator<>内部查找正确的函数和std命名空间;参数相关查找在这里无助于此,因为这两个参数也在std命名空间中.
所以,我的建议是(1)将你的运算符包装到命名空间std {}中,但是UB,IIRC.或者(2)创建一个从std :: pair继承的结构,在命名空间中定义一个新类型,并使用ADL找到你的运算符<(). 更新: 我的第三个建议是使用自定义的操纵器打印出来. 对于我的第二个建议,如果你可以使用C 11,继承自std :: pair应该很容易(未经测试):
struct PAIR : std::pair { using std::pair::pair; };
如果您不能使用C 11,那么我建议使用自定义的操纵器.
原文地址:https://www.jb51.cc/c/111374.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。