#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