模板类中如何定义友元函数?
今天看到一个算法题,就是如果有两个大整数求和,但是这两个大整数的取值范围超过了计算机能表示的范围,要怎么办?
正好之前看了线性表的顺序存储结构,觉得可以将大整数的每一位存储到数组中,然后对数组进行对应位的计算!线性表的顺序存储结构的
实现可以看我的前面的博客,有介绍。现在要写一个大整数求和的算法,即用两个线性表进行相加,所以要将这个算法函数声明为顺序表类的友元函数,
以此来读取类的私有成员!具体实现如下:
template<class T>// 定义模板类 class SeqList { public: ... SeqList(int a, int n); // 有参构造函数,通过大整数建立一个长度为n的顺序表 ... friend SeqList<T> Add(SeqList<T> &A, SeqList<T> &B);// 大整数求和算法 private: T data[MaxSize]; int Length; }; // 构造函数,将大整数的每一位存到数组中,数组低位放置整数的高位 template<class T> inline SeqList<T>::SeqList(int a, int n) { for (int i = n - 1; i >= 0; i--) { data[i] = a % 10; a /= 10; } Length = n; } // 具体算法 ,结果放入表A中 template<class T> SeqList<T> Add(SeqList<T> &A, SeqList<T> &B) { int flag = 0; // 进位标记 int i = 0; // 位数 int n = A.Length; int m = B.Length; while (i < n && i < m) { A.data[i] = (A.data[i] + B.data[i] + flag) % 10; // 计算第i位的值 flag = (A.data[i] + B.data[i] + flag) / 10; // 计算第i位的进位 i++; } // 计算大整数A余下的部分 for (; i < n; i++) { A.data[i] = (A.data[i] + flag) % 10; flag = (A.data[i] + flag) / 10; } // 计算大整数B余下的部分 for (; i < m; i++) { A.data[i] = (B.data[i] + flag) % 10; flag = (B.data[i] + flag) / 10; } int d = (n > m) ? n : m; if (flag == 1) { A.data[d] = 1; A.Length=d+1; } return A; } int main() { int a = 12345678; int b = 123456789; SeqList<int> aa(a,8);// 模板类实例化 SeqList<int> bb(b,9); SeqList<int> D=Add(aa, bb); D.printlist(); system("pause"); return 0; }
写完编译,出错!
感觉写的很对,怎么错了呢??找错吧。。。
于是百度找资料,翻一翻C++ primer,终于发现问题:
函数Add并不是一个模板函数,而下面却用模板函数定义
于是进行修改,修改如下:
template<class T>// 定义模板类 class SeqList { public: ... SeqList(int a, int n); // 有参构造函数,通过大整数建立一个长度为n的顺序表 ... <strong>template</strong><strong><class T></strong> friend SeqList<T> Add(SeqList<T> &A, SeqList<T> &B);// 大整数求和算法 private: T data[MaxSize]; int Length; };
如上修改之后,顺利通过编译!
运行结果如下:
结果正确。