#pragma once
#include <iostream>
using namespace std;
template<typename T1>
class Base
{
public:
Base(T1 a, T1 b);
void showTest();
//重载左移运算符
template<typename T1>
friend ostream& operator<<(ostream& os, Base<T1>& p);
public:
T1 data;
};
template<typename T1>
Base<T1>::Base(T1 a, T1 b)
{
data = a + b;
}
template<typename T1>
void Base<T1>::showTest()
{
cout << "data = " << data << endl;
}
//重载左移运算符
template<typename T1>
ostream& operator<<(ostream& os, Base<T1>& p)
{
os << "data = " << p.data << endl;
return os;
}
void main()
{
Base<int> base1(99,100);
base1.showTest();
cout << base1;
}
注意:
在友元函数申明的时候,要加上函数模板:
//重载左移运算符
template<typename T1>
friend ostream& operator<<(ostream& os, Base<T1>& p);
注意:
在Linux环境下的写法:
//重载左移运算符
template<typename T1>
friend ostream& operator<< <T1>(ostream& os, Base<T1>& p);
//在Linux环境下,重载运算符<<后面加上<T1>
普通友元函数的写法
方法1:
#include <iostream>
using namespace std;
template<typename T1> class Base;
template<typename T1> void PrintTest(Base<T1>& p);
template<typename T1>
class Base
{
public:
Base(T1 a, T1 b);
//普通友元函数写法
//template<typename T1>
friend void PrintTest<T1>(Base<T1>& p);
public:
T1 data;
};
//普通友元函数实现
template<typename T1>
void PrintTest(Base<T1>& p)
{
cout << "data = " << p.data << endl;
}
void main()
{
Base<int> base1(99,100);
PrintTest(base1);
}
方法2:
#include <iostream>
using namespace std;
template<typename T1>
class Base
{
public:
Base(T1 a, T1 b);
//普通友元函数写法
template<typename T1>
friend void PrintTest(Base<T1>& p);
public:
T1 data;
};
//普通友元函数实现
template<typename T1>
void PrintTest(Base<T1>& p)
{
cout << "data = " << p.data << endl;
}
void main()
{
Base<int> base1(99,100);
PrintTest(base1);
}
总代码:
#pragma once
#include <iostream>
using namespace std;
template<typename T1> class Base;
template<typename T1> void PrintTest(Base<T1>& p);
template<typename T1>
class Base
{
public:
Base(T1 a, T1 b);
void showTest();
//重载左移运算符
template<typename T1>
friend ostream& operator<<<T1>(ostream& os, Base<T1>& p);
//普通友元函数写法
//方法1:提前申明
friend void PrintTest<T1>(Base<T1>& p);
//方法2:在类内加上模板申明
//template<typename T1>
//friend void PrintTest(Base<T1>& p);
public:
T1 data;
};
template<typename T1>
Base<T1>::Base(T1 a, T1 b)
{
data = a + b;
}
template<typename T1>
void Base<T1>::showTest()
{
cout << "data = " << data << endl;
}
//重载左移运算符
template<typename T1>
ostream& operator<<(ostream& os, Base<T1>& p)
{
os << "data = " << p.data << endl;
return os;
}
//普通友元函数实现
template<typename T1>
void PrintTest(Base<T1>& p)
{
cout << "data = " << p.data << endl;
}
void main()
{
Base<int> base1(99,100);
base1.showTest();
PrintTest(base1);
cout << base1;
}