起因,昨天寫的一段小程序
#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
;
}
未能通過編譯,報(bào)的錯(cuò)誤是:沒有找到接受“<未知>”類型的右操作數(shù)的運(yùn)算符(或沒有可接受的轉(zhuǎn)換),百思不得其解,應(yīng)為我覺得
我明明重載了<<運(yùn)算符。再?zèng)]有辦法的情況下請(qǐng)教了CSDN論壇上的一些朋友,終于弄明白了其中的原因(可能這個(gè)知識(shí)點(diǎn)很菜,高手
不要見笑)。
ostream_iterator<_Ty, _Elem, _Traits>& operator=(const _Ty& _Val)
{
? *_Myostr << _Val;///~~~~~~~~~~~~~~~~~~~~~~~這是在ostream_iterator類源代碼當(dāng)中,就是這里報(bào)錯(cuò)了
? if (_Mydelim != 0)
? *_Myostr << _Mydelim;
? return
}
在上面那到程序當(dāng)中_Val類型是pair<int,int> *_Myostr類型是ostream,顯然這里出錯(cuò),代表編譯器就好像沒有看到我的重載。出現(xiàn)以上現(xiàn)象的原因就是當(dāng)編譯器看到*_Myostr<<_Val時(shí)候,它會(huì)先在自己的名字空間查找<<,這個(gè)估計(jì)發(fā)生在模板編譯的第一個(gè)階
段(不知道是不是該這么說),它看到了一個(gè)范型的<<重載(估計(jì)),于是就不在去別的地方查找。可是到了實(shí)例化的時(shí)候,編譯器發(fā)現(xiàn)
沒有匹配的<<運(yùn)算,于是就報(bào)錯(cuò)了。如果我們把重載寫在std空間里,也就是和ostream_iterator一個(gè)空間里,編譯器在實(shí)例化的時(shí)
候也會(huì)把它納入考慮對(duì)象之一,這個(gè)時(shí)候它就會(huì)選擇我們的重載,一切就OK了。注意,如果編譯器在*_Myostr<<_Val所在名字空間沒有找到
<<重載,則它會(huì)進(jìn)行類型相關(guān)查找。就是去定義*_Myostr類型或_Va類型的空間查找,再找不到那它就會(huì)去全局空間去查找。
個(gè)人理解,不是很肯定,誠請(qǐng)高手糾正,感謝CSDN上周星星和晨星。