关于重载输入输出在类模板中的应用(求大佬指点)

#include<iostream>
#include<cstdlib>
using namespace std;
template<class T>
class data1
{
private:
    T* date;
    int size;
public:
    data1(int n=0);
    ~data1();
    data1(const data1<T>& cp);
    data1<T>& operator=(const data1<T>& cp);
    T get(int _size);
    friend istream& operator>>(istream& in, data1<T>& cp);
    friend ostream& operator<<(ostream& out, data1<T>& cp);
};
template<class T>
data1<T>::data1(int n):size(n)
{
    date = new T[size];
    for (int i = 0; i < size; i++)
    {
        date[i] = rand() % 100;
    }
}
template<class T>
data1<T>::~data1()
{
    if (date != 0)
        delete[]date;
}
template<class T>
data1<T>::data1(const data1<T>& cp)
{
    size = cp.size;
    date = new T[size];
    for (int i = 0; i < size; i++)
    {
        date[i] = cp.date[i];
    }

}
template<class T>
data1<T>& data1<T>::operator=(const data1<T>& cp)
{
       if (date != 0)
        delete[]date;
       size = cp.size;
       date = new T[size];
       for (int i = 0; i < size; i++)
       {
           date[i] = cp.date[i];
       }
}
template<class T>
T data1<T>::get(int _size)
{
    return date[_size];
}
template<class T>
istream& operator>>(istream& in, const data1<T>& cp)
{
    in >> cp.size;
    for (int i = 0; i <cp.size; i++)
    {
        in >> cp.date[i];
    }
    return in;
 }
template<class T>
ostream& operator<<(ostream& out,const data1<T>& cp)

    out << "输出元素个数为:" << cp.size << endl;
    for (int i = 0; i < cp.size; i++)
    {
        out >> cp.date[i]<<" ";
    }
    return out;
}
int main()
{
    data1<int> bu9(5);
    cin >> bu9//调用重载输入模板,出现无法解析外部符号,这是为什么呢?
    cout << bu9;
    return 0;

}

将友元函数在模板类内部实现就好了,再Effective C++条款45中,有详细解释

FYI: https://stackoverflow.com/questions/10787655/c-friend-declaration-declares-a-non-template-function 

#include<iostream>
#include<cstdlib>

using namespace std;

template<class T>
class data1
{
private:
    T* date;
    int size;
public:
    data1(int n=0);
    ~data1();
    data1(const data1<T>& cp);
    data1<T>& operator=(const data1<T>& cp);
    T get(int _size);
    
    friend istream& operator>>(istream& in, data1& cp)
    {
        in >> cp.size;
        for (int i = 0; i <cp.size; i++)
        {
            in >> cp.date[i];
        }
        return in;
     }
     
    friend ostream& operator<<(ostream& out, data1 const& cp)
    {
        out << "输出元素个数为:" << cp.size << endl;
        for (int i = 0; i < cp.size; i++)
        {
            out << cp.date[i] <<" ";
        }
        return out;
    }
};
template<class T>
data1<T>::data1(int n):size(n)
{
    date = new T[size];
    for (int i = 0; i < size; i++)
    {
        date[i] = rand() % 100;
    }
}
template<class T>
data1<T>::~data1()
{
    if (date != 0)
        delete[]date;
}
template<class T>
data1<T>::data1(const data1<T>& cp)
{
    size = cp.size;
    date = new T[size];
    for (int i = 0; i < size; i++)
    {
        date[i] = cp.date[i];
    }

}
template<class T>
data1<T>& data1<T>::operator=(const data1<T>& cp)
{
       if (date != 0)
        delete[]date;
       size = cp.size;
       date = new T[size];
       for (int i = 0; i < size; i++)
       {
           date[i] = cp.date[i];
       }
}
template<class T>
T data1<T>::get(int _size)
{
    return date[_size];
}
/*
template<class T>
istream& operator>>(istream& in, data1<T>& cp)
{
    in >> cp.size;
    for (int i = 0; i <cp.size; i++)
    {
        in >> cp.date[i];
    }
    return in;
 }
template<class T>
ostream& operator<<(ostream& out, data1<T> const& cp)
{ 
    out << "输出元素个数为:" << cp.size << endl;
    for (int i = 0; i < cp.size; i++)
    {
        out >> cp.date[i]<<" ";
    }
    return out;
}
*/
int main()
{
    data1<int> bu9(5);
    cin >> bu9;//调用重载输入模板,出现无法解析外部符号,这是为什么呢?
    cout << bu9;
    return 0;

}

// Output
4                                                                                                                                                                                 
101 102 103 104                                                                                                                                                                   
输出元素个数为:4                                                                                                                                                                 
101 102 103 104  

 

声明为 友元函数即可,h和cpp写在一起,成为hpp文件会比较好,望采纳,不懂的可以关注私信我。

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y