首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

无法解析的外部符号-VC6编译通过,VS2005&2010编译都不通过,该如何解决

2012-05-06 
无法解析的外部符号--VC6编译通过,VS2005&2010编译都不通过选择法排序,以下是VS2010下的错误信息错误1erro

无法解析的外部符号--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

C/C++ code
#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;    }}


[解决办法]
修改一下在类sort中的重载输入和输出操作符的声明就可以了,修改为:
template<typename U> friend ostream & operator <<(ostream &o,const Sort<U> &);
template<typename U> friend istream & operator >>(istream &i,Sort<U> &);

重载输入操作符时:Sort<U> & 不要定义为const对象,因为输入操作符就是要读入数据并存储到Sort<U> 对象中,定义为const就不能存储读入的数据了,
同时在定义处也修改一下就可以了,修改为:
template<typename U>
ostream& operator <<(ostream &o,Sort<U>)
{}



template<typename U>
istream& operator >>(istream &i,Sort<U>)
{}

[解决办法]

C/C++ code
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;    }}//自己看吧,不解释了
[解决办法]
模板类中的友元函数模板在类外定义的话,必须在该模板类的定义之前进行定义,而且在模板类中的友元函数模板的声明时,在友元函数模板名字后面跟友元函数模板参数列表之间加上模板类的模板形参,或则加上<>。

比如你写的代码这样修改就可以了:

C/C++ code
#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, 如果你想类内定义友元函数模板也可以,但是当同一个函数模板同时是两个模板类的友元函数模板的时候,在类内定义这个函数模板会有编译错误,这时就要类外定外定义友元函数模板

热点排行