首页 新闻 会员 周边 捐助

有关友元函数的问题

0
悬赏园豆:10 [已解决问题] 解决于 2014-07-28 16:30

为什么我的编译不过去呢,提示说有“无法解析的外部符号“;我实在找不出原因?(本人刚开始学习C++和数据结构),求帮忙!谢谢啦。。。

当我把主函数中的“s3=(s1+s2);“注释掉后,就编译通过并输出正确结果了!为什么会这样呢,你造吗?谢谢啦。。。

  1 //头文件:SL_List.h
  2 #include<iostream>
  3 using namespace std;
  4 
  5 //从小到大
  6 template<class T>
  7 class SL_List
  8 {
  9 private:
 10     int mm;
 11     int nn;
 12     T *v;
 13 public:
 14     SL_List(){mm=0;nn=0;return;}
 15     SL_List(int);
 16     int search_SL_List(T);
 17     int insert_SL_List(T);
 18     int delete_SL_List(T);
 19     void prt_SL_List();
 20     friend SL_List operator+(SL_List &,SL_List &);
 21 };
 22 
 23 // 初始化
 24 template<class T>
 25 SL_List<T>::SL_List(int m)
 26 {
 27     mm=m;
 28     v=new T[mm];
 29     nn=0;
 30     return;
 31 }
 32 
 33 //查找
 34 template<class T>
 35 int SL_List<T>::search_SL_List(T x)
 36 {
 37     int i,j,k;
 38     i=1;j=nn;
 39     while(i<=j)
 40     {
 41         k=(i+j)/2;
 42         if(v[k-1]==x)
 43             return (k-1);
 44         if(v[k-1]>x)
 45             j=k-1;
 46         else
 47             i=k+1;
 48     }
 49     return (-1);
 50 }
 51 
 52 //插入
 53 template<class T>
 54 int SL_List<T>::insert_SL_List(T x)
 55 {
 56     int k;
 57     if(nn==mm)
 58     {cout<<"上溢!"<<endl;return(-1);}
 59     k=nn-1;
 60     while(v[k]>x)
 61     {v[k+1]=v[k];k--;}
 62     v[k+1]=x;
 63     nn=nn+1;
 64     return 1;
 65 }
 66 
 67 //删除
 68 template<class T>
 69 int SL_List<T>::delete_SL_List(T x)
 70 {
 71     int i,k;
 72     k=search_SL_List(x);
 73     if(k>=0)
 74     {
 75         for(i=k;i<nn-1;i++)
 76             v[i]=v[i+1];
 77         nn=nn-1;
 78     }
 79     else
 80         cout<<"表中没有这个元素!"<<endl;
 81     return (k);
 82 }
 83 
 84 //输出
 85 template<class T>
 86 void SL_List<T>::prt_SL_List()
 87 {
 88     int i;
 89     cout<<"nn="<<nn<<endl;
 90     for(i=0;i<nn;i++)
 91         cout<<v[i]<<endl;
 92     return;    
 93 }
 94 
 95 //合并
 96 template<class T>
 97 SL_List<T> operator+(SL_List<T> &s1,SL_List<T> &s2)
 98 {
 99     int k=0,i=0,j=0;
100     SL_List<T> s;
101     
102     s.v=new T[s1.nn+s2.nn];
103     if(s.v==NULL)
104         return(-1);
105     while((i<s1.nn) && (j<s2.nn))
106     {
107         if(s1.v[i]<=s2.v[j])
108             s.v[k++]=s1.v[i++];
109         else
110             s.v[k++]=s2.v[j++];
111     }
112     while(i<s1.nn)
113         s.v[k++]=s1.v[i++];
114     while(j<s2.nn)
115         s.v[k++]=s2.v[j++];
116     
117     s.mm=s1.mm+s2.mm;
118     s.nn=s1.nn+s2.nn;
119     return (s);
120 }
121 
122 
123 
124 
125 
126 
127 //主函数部分:main.cpp
128 #include"SL_List.h"
129 
130 int main()
131 {
132     int k;
133     double a[5]={1.5,5.5,2.5,4.5,3.5};
134     double b[7]={1.0,7.5,2.5,4.0,5.0,4.5,6.5};
135     SL_List<double> s1(20);
136     SL_List<double> s2(30);
137     for(k=0;k<5;k++)
138         s1.insert_SL_List(a[k]);
139     for(k=0;k<7;k++)
140         s2.insert_SL_List(b[k]);
141     cout<<"输出有序表对象s1:"<<endl;
142     s1.prt_SL_List();
143     cout<<"输出有序表对象s2:"<<endl;
144     s2.prt_SL_List();
145     SL_List<double> s3;
146     s3=(s1+s2);
147     cout<<"输出合并后的有序表对象s3:"<<endl;
148     s3.prt_SL_List();
149     s3.delete_SL_List(a[0]);
150     s3.delete_SL_List(b[0]);
151     s3.delete_SL_List(123.0);
152     cout<<"输出删除后的有序表对象:"<<endl;
153     s3.prt_SL_List();
154 
155     return 0;
156 }
苗苗彬的主页 苗苗彬 | 初学一级 | 园豆:184
提问于:2014-07-28 16:12
< >
分享
最佳答案
0

找到答案了!!嘻嘻。。。。

类似问题:模板类中操作符重载问题("<<"和">>"重载)

在模板类中输入流“>>”和输出流“<<”的重载,若使用友元在类内声明,在类外实现,那么连接时将会报错,但我们可以采用以下三种方式来实现输出流"<<"和"输入流>>"的重载。

一、将输出流"<<"和"输入流>>"重载的实现写在类中

二、既然类外实现相当于重定义了一个函数模板,那么只要他不使用类的私用成员即可,因此重载的函数模板只有通过类的公有成员函数来实现对类的私有成员的操作,这样不必在类内声明它为友元,直接在类外重载即可。

三、使用过渡函数

详见:http://www.cnblogs.com/xkfz007/articles/2534322.html

顺便谢谢博主分享!!

苗苗彬 | 初学一级 |园豆:184 | 2014-07-28 16:27
其他回答(2)
0

编译器告诉你哪个符号是“无法解析的外部符号”?

收获园豆:5
Launcher | 园豆:45050 (高人七级) | 2014-07-28 16:19

谢谢哈!

支持(0) 反对(0) 苗苗彬 | 园豆:184 (初学一级) | 2014-07-28 16:32
0

//合并

96 template<class T>

97 SL_List<T> operator+(SL_List<T> &s1,SL_List<T> &s2)

98 {

99 int k=0,i=0,j=0;

100 SL_List<T> s;

101

102 s.v=new T[s1.nn+s2.nn];

调用这个操作符重载时,发生异常.

你这个是SL_List<T>是类,不是结构体.你定义了SL_List<T> s; 后并没有初始化而直接调用了s.v这时发生空引用异常

收获园豆:5
吴瑞祥 | 园豆:29449 (高人七级) | 2014-07-28 16:23

谢谢啦!

支持(0) 反对(0) 苗苗彬 | 园豆:184 (初学一级) | 2014-07-28 16:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册