VC++ C++ C# Algorithm

C++博客 首页 新随笔 联系 聚合 管理
  21 Posts :: 3 Stories :: 31 Comments :: 0 Trackbacks
起因,昨天写的一段小程序
#include  < iostream >
#include 
< map >
#include 
< iterator >
#include 
< vector >
#include 
< algorithm >
using   namespace  std;
ostream 
& operator << (ostream  & os, const  pair < int , int >   &
mp)
{
   os
<<
mp.first;
   os
<<
mp.second;
   
return
 os;
}

int  _tmain( int  argc, _TCHAR *  argv[])
{
   pair
< int , int >  mmp( 100 , 200
);
   cout
<<
mmp;
   map
< int , int >
 imap;
   map.insert(make_pair(
100 , 100
));
   imap.insert(make_pair(
22 , 123
));
   copy(imap.begin(),imap.end(),ostream_iterator
< pair < int , int >   > (cout, " \n "
));
   
return   0
;
}

未能通过编译,报的错误是:没有找到接受“<未知>”类型的右操作数的运算符(或没有可接受的转换),百思不得其解,应为我觉得 我明明重载了<<运算符。再没有办法的情况下请教了CSDN论坛上的一些朋友,终于弄明白了其中的原因(可能这个知识点很菜,高手 不要见笑)。
ostream_iterator<_Ty, _Elem, _Traits>& operator=(const _Ty& _Val)
{
  *_Myostr << _Val;///~~~~~~~~~~~~~~~~~~~~~~~这是在ostream_iterator类源代码当中,就是这里报错了
  if (_Mydelim != 0)
  *_Myostr << _Mydelim;
  return
}
在上面那到程序当中_Val类型是pair<int,int> *_Myostr类型是ostream,显然这里出错,代表编译器就好像没有看到我的重载。出现以上现象的原因就是当编译器看到*_Myostr<<_Val时候,它会先在自己的名字空间查找<<,这个估计发生在模板编译的第一个阶
段(不知道是不是该这么说),它看到了一个范型的<<重载(估计),于是就不在去别的地方查找。可是到了实例化的时候,编译器发现 没有匹配的<<运算,于是就报错了。如果我们把重载写在std空间里,也就是和ostream_iterator一个空间里,编译器在实例化的时 候也会把它纳入考虑对象之一,这个时候它就会选择我们的重载,一切就OK了。注意,如果编译器在*_Myostr<<_Val所在名字空间没有找到 <<重载,则它会进行类型相关查找。就是去定义*_Myostr类型或_Va类型的空间查找,再找不到那它就会去全局空间去查找。
个人理解,不是很肯定,诚请高手纠正,感谢CSDN上周星星和晨星。

posted on 2006-12-29 19:42 大熊猫 阅读(1862) 评论(13)  编辑 收藏 引用

Feedback

# re: c++名字查找 2006-12-30 02:40 Francis Arcanum
http://www.cppblog.com/shifan3/archive/2006/12/27/16902.html
我的这篇文章也许对你有用  回复  更多评论
  

# re: c++陈义忠 2007-01-14 22:44 陈义忠
@Francis Arcanum
  回复  更多评论
  

# re: c++名字查找 2007-02-15 10:35 郝志群
查找郝志群地址  回复  更多评论
  

# re: c++名字查找 2007-05-12 18:08 吴细珍
我要找到此人  回复  更多评论
  

# re: c++名字查找 2007-06-01 15:29 胡美爱
既然的 "安康[ JMHD MNDB 我紧密功能反对恐惧
  回复  更多评论
  

# re: c++名字查找 2007-06-18 16:11 李厚娟
我爱她你不想我吗?
  回复  更多评论
  

# re: c++名字查找 2007-10-06 18:06 晚会垂柳
sds  回复  更多评论
  

# re: c++名字查找 2007-10-06 18:06 晚会垂柳
dd  回复  更多评论
  

# re: c++名字查找 2008-09-11 08:21 王疆
所有内容  回复  更多评论
  

# re: c++名字查找 2008-09-11 08:23 王疆
我要找到王疆
  回复  更多评论
  

# re: c++名字查找 2008-10-24 17:48 黄建宁
桔柑  回复  更多评论
  

# re: c++名字查找 2009-02-25 11:53
名字区码  回复  更多评论
  

# re: c++名字查找 2009-03-11 19:12 周敏桢
是  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理