模板类中如何定义友元函数?

今天看到一个算法题,就是如果有两个大整数求和,但是这两个大整数的取值范围超过了计算机能表示的范围,要怎么办?

正好之前看了线性表的顺序存储结构,觉得可以将大整数的每一位存储到数组中,然后对数组进行对应位的计算!线性表的顺序存储结构的

实现可以看我的前面的博客,有介绍。现在要写一个大整数求和的算法,即用两个线性表进行相加,所以要将这个算法函数声明为顺序表类的友元函数,

以此来读取类的私有成员!具体实现如下:

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的顺序表
        ...
    template<class T>    
    friend SeqList<T> Add(SeqList<T> &A, SeqList<T> &B);// 大整数求和算法
private:
    T data[MaxSize];
    int Length;

};  

如上修改之后,顺利通过编译!

运行结果如下:

结果正确。

 

posted @ 2017-12-20 19:46  ~君莫笑~  阅读(5756)  评论(0编辑  收藏  举报