无法解析的外部符号--VC6编译通过,VS2005&2010编译都不通过
选择法排序,以下是VS2010下的错误信息
错误1error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Sort<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Sort@H@@@Z),该符号在函数 _main 中被引用F:\Study\C&C++\C++\projects\sort\sort\sort.obj
错误2error LNK2019: 无法解析的外部符号 "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class Sort<int> const &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Sort@H@@@Z),该符号在函数 _main 中被引用F:\Study\C&C++\C++\projects\sort\sort\sort.obj
#include<iostream>using namespace std;template<class T>class Sort{ T *element; int size;public: Sort(int n); ~Sort(); int find_min(int i); void arrange(); friend ostream& operator<<(ostream& o, const Sort<T>& s); friend istream& operator>>(istream& i, const Sort<T>& s);};template<class T>Sort<T>::Sort(int n){ size=n; element=new T[size];}template<class T>Sort<T>::~Sort(){ delete[] element;}template<class T>int Sort<T>::find_min(int i){ int j,k=i; T temp=*(element+i); for(j=i+1;j<size;j++) { if(temp>*(element+j)) { temp=*(element+j); k=j; } } return k;}template<class T>void Sort<T>::arrange(){ int i,k; T temp; for(i=0;i<size-1;i++) { k=find_min(i); if(k!=i) { temp=*(element+i); *(element+i)=*(element+k); *(element+k)=temp; } }}template<class T>ostream& operator<<(ostream& o, const Sort<T>& s){ int i; for(i=0;i<s.size;i++) o<<*(s.element+i)<<" "; return o;}template<class T>istream& operator>>(istream& i,const Sort<T>& s){ int j; for(j=0;j<s.size;j++) i>>*(s.element+j); return i;}void start_interface(void){ cout<<"请选择想要排序的数据类型:"<<endl; cout<<"1→整型。"<<endl; cout<<"2→浮点型。"<<endl; cout<<"3→双精度浮点型。"<<endl;}void main(){ start_interface(); int x; cin>>x; int n; cout<<"请输入数组长度:"<<endl; cin>>n; cout<<"请输入"<<n<<"个数字:"<<endl; if(x==1) //整型 { Sort<int> s1(n); cin>>s1; s1.arrange(); cout<<s1<<endl; } else if(x==2) //浮点型 { Sort<float> s2(n); cin>>s2; s2.arrange(); cout<<s2<<endl; } else if(x==3) //双精度浮点型 { Sort<double> s3(n); cin>>s3; s3.arrange(); cout<<s3<<endl; }}
template<typename U>
istream& operator >>(istream &i,Sort<U>)
{}
[解决办法]
template<class T>class Sort{ T *element; int size;public: Sort(int n); ~Sort(); int find_min(int i); void arrange(); friend ostream& operator<<(ostream& o, const Sort<T>& s){ int i; for(i=0;i<s.size;i++) o<<*(s.element+i)<<" "; return o; } friend istream& operator>>(istream& i, Sort<T>& s){ int j; for(j=0;j<s.size;j++) i>>*(s.element+j); return i; }};template<class T>Sort<T>::Sort(int n){ size=n; element=new T[size];}template<class T>Sort<T>::~Sort(){ delete[] element;}template<class T>int Sort<T>::find_min(int i){ int j,k=i; T temp=*(element+i); for(j=i+1;j<size;j++) { if(temp>*(element+j)) { temp=*(element+j); k=j; } } return k;}template<class T>void Sort<T>::arrange(){ int i,k; T temp; for(i=0;i<size-1;i++) { k=find_min(i); if(k!=i) { temp=*(element+i); *(element+i)=*(element+k); *(element+k)=temp; } }}//template<class T>//ostream& operator<<(ostream& o, const Sort<T>& s)//{// int i;// for(i=0;i<s.size;i++)// o<<*(s.element+i)<<" ";// return o;//}//template<class T>//istream & operator>>(istream & i,Sort<T> & s)//{// int j;// for(j=0;j<s.size;j++)// i>>*(s.element+j);// return i;//}void start_interface(void){ cout<<"请选择想要排序的数据类型:"<<endl; cout<<"1→整型。"<<endl; cout<<"2→浮点型。"<<endl; cout<<"3→双精度浮点型。"<<endl;}void main(){ start_interface(); int x; cin>>x; int n; cout<<"请输入数组长度:"<<endl; cin>>n; cout<<"请输入"<<n<<"个数字:"<<endl; if(x==1) //整型 { Sort<int> s1(4); cin>>s1; s1.arrange(); cout<<s1<<endl; } else if(x==2) //浮点型 { Sort<float> s2(n); cin>>s2; s2.arrange(); cout<<s2<<endl; } else if(x==3) //双精度浮点型 { Sort<double> s3(n); cin>>s3; s3.arrange(); cout<<s3<<endl; }}//自己看吧,不解释了
[解决办法]
模板类中的友元函数模板在类外定义的话,必须在该模板类的定义之前进行定义,而且在模板类中的友元函数模板的声明时,在友元函数模板名字后面跟友元函数模板参数列表之间加上模板类的模板形参,或则加上<>。
比如你写的代码这样修改就可以了:
#include<iostream>using namespace std;//这是修改的部分:template<class T> class Sort;//需要先声明该类模板template<typename U>ostream &operator <<(ostream &o,Sort<U>)//重载输出操作符的类外定义,这里使用U或T都一样{int i; for(i=0;i<s.size;i++) o<<*(s.element+i)<<" "; return o;}template<typename U>istream &operator >>(istream &i,Sort<U>)//输入操作符重载函数的类外定义{ int j; for(j=0;j<s.size;j++) i>>*(s.element+j); return i;}//上面是修改的部分template<class T>class Sort{ T *element; int size;public: Sort(int n); ~Sort(); int find_min(int i); void arrange(); friend ostream& operator<< <T>(ostream& o, const Sort<T>& s);//函数参数列表前加上<> friend istream& operator>> <T>(istream& i, const Sort<T>& s);//函数参数列表前加上<>};template<class T>Sort<T>::Sort(int n){ size=n; element=new T[size];}template<class T>Sort<T>::~Sort(){ delete[] element;}template<class T>int Sort<T>::find_min(int i){ int j,k=i; T temp=*(element+i); for(j=i+1;j<size;j++) { if(temp>*(element+j)) { temp=*(element+j); k=j; } } return k;}template<class T>void Sort<T>::arrange(){ int i,k; T temp; for(i=0;i<size-1;i++) { k=find_min(i); if(k!=i) { temp=*(element+i); *(element+i)=*(element+k); *(element+k)=temp; } }}void start_interface(void){ cout<<"请选择想要排序的数据类型:"<<endl; cout<<"1→整型。"<<endl; cout<<"2→浮点型。"<<endl; cout<<"3→双精度浮点型。"<<endl;}void main(){ start_interface(); int x; cin>>x; int n; cout<<"请输入数组长度:"<<endl; cin>>n; cout<<"请输入"<<n<<"个数字:"<<endl; if(x==1) //整型 { Sort<int> s1(n); cin>>s1; s1.arrange(); cout<<s1<<endl; } else if(x==2) //浮点型 { Sort<float> s2(n); cin>>s2; s2.arrange(); cout<<s2<<endl; } else if(x==3) //双精度浮点型 { Sort<double> s3(n); cin>>s3; s3.arrange(); cout<<s3<<endl; }}
[解决办法]
ostream &operator <<(ostream &o,Sort<U> &s)这个函数定义的时候,少了Sort<U> &s的变量,加上&s, 如果你想类内定义友元函数模板也可以,但是当同一个函数模板同时是两个模板类的友元函数模板的时候,在类内定义这个函数模板会有编译错误,这时就要类外定外定义友元函数模板