运算符重载和模板的使用

#include<iostream>
using namespace std;
template<typename T>
class CComplex    // CComplex<int>
{
public:
	CComplex(T r = T(), T i = T())
		:mreal(r), mimage(i){}
	//前置和后置++运算符的重载
	CComplex& operator++()
	{
		++mreal;
		++mimage;
		return *this;
	}
	CComplex operator++(int)
	{
		return CComplex(mreal++, mimage++);
	}
private:
	T mreal;
	T mimage;

	//template<typename T>加上这个是一个类对多个友元函数,没有意义的
	
	//友元函数声明为模板函数必须在重载的运算符后面加上类型T
	friend ostream& operator<< <T>(ostream &os, const CComplex<T> &obj);

	friend CComplex<T> operator+<T>(const CComplex<T> &lhs,
		const CComplex<T> &rhs);
};

template<typename T>
ostream& operator<<(ostream &out, const CComplex<T> &src)
{
	out << "real:" << src.mreal << " image:" << src.mimage;
	return out;
}

template<typename T>
CComplex<T> operator+(const CComplex<T> &lhs,
	const CComplex<T> &rhs)
{
	return CComplex<T>(lhs.mreal + rhs.mreal,
		lhs.mimage + rhs.mimage);
}
//特例化模板
template<>
CComplex<int> operator+<int>(const CComplex<int> &lhs,
	const CComplex<int> &rhs)
{
	return CComplex<int>(lhs.mreal + rhs.mreal,
		lhs.mimage + rhs.mimage);
}


int main(int argc, char* argv[])
{
	CComplex<int> comp1;
	comp1++;
	++comp1;
	cout << comp1 << endl;
	CComplex<int> comp2(20, 20);
	CComplex<int> comp3 = comp1 + comp2;
	cout << comp3 << endl;
	
	//comp3 = comp1 + 20;
	//      ::operator+(comp1, 20)   //int  => CComplex<T>
	//comp3 = ::operator+<int>(comp1, 20);//CComplex<type>  => CComplex<T>
	//无法从“int”为“const CComplex<T> &”推导 模板 参数
	cin.get();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值