加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么ostream_iterator不按预期工作?

发布时间:2020-12-16 03:26:55 所属栏目:百科 来源:网络整理
导读:不用说以下代码: #include utility#include vector#include iostream#include iteratorusing namespace std;typedef pairchar,char PAIR;ostream operator (ostream os,const PAIR r){ return os r.first;}int main() { vectorPAIR coll; cout coll[0]; //
不用说以下代码:
#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,那么我建议使用自定义的操纵器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读