为什么我的编译不过去呢,提示说有“无法解析的外部符号“;我实在找不出原因?(本人刚开始学习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 }
找到答案了!!嘻嘻。。。。
在模板类中输入流“>>”和输出流“<<”的重载,若使用友元在类内声明,在类外实现,那么连接时将会报错,但我们可以采用以下三种方式来实现输出流"<<"和"输入流>>"的重载。
一、将输出流"<<"和"输入流>>"重载的实现写在类中
二、既然类外实现相当于重定义了一个函数模板,那么只要他不使用类的私用成员即可,因此重载的函数模板只有通过类的公有成员函数来实现对类的私有成员的操作,这样不必在类内声明它为友元,直接在类外重载即可。
三、使用过渡函数
详见:http://www.cnblogs.com/xkfz007/articles/2534322.html;
顺便谢谢博主分享!!
编译器告诉你哪个符号是“无法解析的外部符号”?
谢谢哈!
//合并
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这时发生空引用异常
谢谢啦!