1
#include <iostream>
2
using namespace std;
3
4
template<typename T>
5
class sample
6
{
7
public:
8
9
friend ostream& operator<< <T>(ostream& out, const sample<T>& operand );
10
//{
11
// out<<"Value : "<<operand.data<<std::endl;
12
// return out;
13
//}
14
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
22
sample(T d = T()):data(d) {}
23
24
private:
25
26
T data;
27
};
28
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;
#include <iostream>2
using namespace std;3

4
template<typename T>5
class sample6
{7
public:8

9
friend ostream& operator<< <T>(ostream& out, const sample<T>& operand );10
//{11
// out<<"Value : "<<operand.data<<std::endl;12
// return out;13
//}14

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

22
sample(T d = T()):data(d) {}23

24
private:25

26
T data;27
};28

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;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 );
friend ostream& operator<< <T>(ostream& out, const sample<T>& operand );2
friend istream& operator>> <T>(istream& in, sample<T>& operand ); 如果写成
1
friend ostream& operator<< /*空缺*/ (ostream& out, const sample<T>& operand );
friend ostream& operator<< /*空缺*/ (ostream& out, const sample<T>& operand );2
friend istream& operator>> /*空缺*/ (istream& in, sample<T>& operand );
是可以通过编译但是无法link的。原因是这两个友元声明会被解释为引用了两个非模板函数, 而这两个函数的参数类型是类模板sample<T>的一个实例,而模板函数和同名的非模板函数可以共存。(C++ Primer Ed.3 C16.4), 导致link时找不到函数定义。
PS:另一种写法是在类模板内部直接写两个函数的定义,这样不用给两个友元函数指定<T>也没有上述的问题。
-----------------------------------------------------------
每天进步一点


sample(T d
浙公网安备 33010602011771号