起因,昨天寫的一段小程序
#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上周星星和晨星。