1
#include <iostream>
2
using namespace std;
3![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
template<typename T>
5
class sample
6
{
7
public:
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
friend ostream& operator<< <T>(ostream& out, const sample<T>& operand );
10
//{
11
// out<<"Value : "<<operand.data<<std::endl;
12
// return out;
13
//}
14![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
friend istream& operator>> <T>(istream& in, sample<T>& operand );
16
//{
17
// std::cout<<"Input data: ";
18
// in>>operand.data;
19
// return in;
20
//}
21![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
sample(T d = T()):data(d) {}
23![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
private:
25![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
T data;
27
};
28![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
template<typename T>
30
ostream& operator<<(ostream& out, const sample<T>& operand )
31
{
32
out<<"Value : "<<operand.data<<std::endl;
33
return out;
34
}
35
36
template<typename T>
37
istream& operator>>(istream& in, sample<T>& operand )
38
{
39
std::cout<<"Input data: ";
40
in>>operand.data;
41
return in;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42 }
其中,两个友元函数 operator<<(...) 和 operator>>(...) 必须要指定类型为<T>,即如下面所展示:
1
friend ostream& operator<< <T>(ostream& out, const sample<T>& operand );
2
friend istream& operator>> <T>(istream& in, sample<T>& operand );
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果写成
1
friend ostream& operator<< /*空缺*/ (ostream& out, const sample<T>& operand );
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
2 friend istream& operator>> /*空缺*/ (istream& in, sample<T>& operand );
是可以通过编译但是无法link的。原因是这两个友元声明会被解释为引用了两个非模板函数, 而这两个函数的参数类型是类模板sample<T>的一个实例,而模板函数和同名的非模板函数可以共存。(C++ Primer Ed.3 C16.4), 导致link时找不到函数定义。
PS:另一种写法是在类模板内部直接写两个函数的定义,这样不用给两个友元函数指定<T>也没有上述的问题。
-----------------------------------------------------------
每天进步一点