运算符重载与函数的有关问题···

运算符重载与函数的问题···
#include<iostream>
#include<iterator>
#include<vector>
using namespace std;
/*template<typename T>
void print(const T&t){
typename T::const_iterator iter;
for(iter=t.begin();iter!=t.end();++iter){
cout<<*iter<<" ";
}
cout<<endl;
}*/
可以正常使用这个函数。
template<typename T>
ostream&operator<<(ostream&out,const T&t){
typename T::const_iterator iter;
for(iter=t.begin();iter!=t.end();++iter){
cout<<*iter<<" ";
}
return out;
}
重载之后的<<在不调用的情况下可以正常运行,但调用的时候就不行了!
int main(int argc,char *argv[]){
vector<int> mv(5,1);
//print(mv);
cout<<mv<<endl;
return 0;
}
请高人指点,为什么写成函数就可以运行,而写成重载就不行了呢?
但愿高人能指点一下~~~~

------解决方案--------------------
1、声明的时候记得用friend函数;
2、cout<<*iter<<" "改为out<<*iter<<" "。
------解决方案--------------------
探讨

1、声明的时候记得用friend函数;
2、cout<<*iter<<" "改为out<<*iter<<" "。

------解决方案--------------------
这样定义会造成你自己重载的模板<<运算符覆盖了原本的<<,在out<<*iter的时候无法判断是递归还是调用原本的<<。

解决方法我不知道,但是如果有Concept就很容易解决
------解决方案--------------------
顺便这个问题跟友元函数完全没关系
------解决方案--------------------
试了下,改成这样可以用了

template<typename T, typename _Elem, typename _Traits>
basic_ostream<_Elem, _Traits>& operator<<(basic_ostream<_Elem, _Traits>& out,const T&t){
typename T::const_iterator iter;
for(iter=t.begin();iter!=t.end();++iter){
out<<*iter<<" ";
}
return out;
}