函数和函数模版在一个。cpp中的情况!(除了左移和右移,其他的不要用友元函数!!!)

// 友元函数和运算符重载的碰撞.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>

using namespace std;
template <typename T>
class sten_fri
{
public:
	sten_fri(T a);
	sten_fri & operator +(sten_fri &sf2);
	sten_fri & operator -(sten_fri & sf3);

	friend ostream & operator << <T>(ostream &out, sten_fri sf);
protected:
private:
	T a;
};

template <typename T>
sten_fri<T> ::sten_fri<T>(T a)
{
	this->a = a;
}

template <typename T>
sten_fri<T> & sten_fri<T>::operator +(sten_fri<T> &sf2)
{
	this->a = this->a + sf2.a;
	return *this;
}

template <typename T>
sten_fri<T> & sten_fri <T>::operator -(sten_fri<T> & sf3)
{
	this->a = this->a - sf3.a;
	return *this;
}

template <typename T>
ostream & operator << (ostream &out, sten_fri <T>sf)
{
	out << sf.a << endl;
	return out;
}


int main()
{
	//需要把模版类进行具体化之后,才能定义对象,因为c++要分配内存
	sten_fri <int>	a1(5);
	cout << a1;//这里的友元函数中ostream out中间必须加引用,要不然是错误的。
	sten_fri <int>	a2(2);
	a1 = a1 + a2;
	cout << a1;
	a1 = a1 - a2;
	cout << a2;

	system("pause");
	return 0;
}

  

//友元函数:友元函数不是实现函数重载(非 << >>)(特别麻烦,所以除了<<  >>都不用)

                          //1)需要在类前增加 类的前置声明 函数的前置声明

                                   template<typename T>

class Complex; 

template<typename T>

Complex<T> mySub(Complex<T> &c1, Complex<T> &c2);

                          //2)类的内部声明 必须写成:

friend Complex<T> mySub <T> (Complex<T> &c1, Complex<T> &c2);

                          //3)友元函数实现 必须写成:

                                   template<typename T>

                Complex<T> mySub(Complex<T> &c1, Complex<T> &c2)

{

                    Complex<T> tmp(c1.a - c2.a, c1.b-c2.b);

                    return tmp;

}

            //4)友元函数调用 必须写成

                                   Complex<int> c4 = mySub<int>(c1, c2);

                cout<<c4;

 

结论:友元函数只用来进行左移友移操作符重载。

原文地址:https://www.cnblogs.com/xiaochige/p/6804222.html