当函数模板中重载友元函数时,需要进行前置声明

#include<iostream>
using std::cout;
using std::endl;
using std::ostream;
template<typename T>
class  Complex;//进行类的前置声明
template<typename T>
ostream &operator<<(ostream &out,const Complex<T> &c3);
template<typename T>//友元函数的前置声明
class  Complex
{
	public:
		Complex(T ,T );
		void printCom();
		Complex<T> operator+(Complex &c2);
		friend ostream &operator<< <T>(ostream &out,const Complex<T> &c3);
	private:
		T a;
		T b;
};

当没有进行前置声明时,会报该错误 error: declaration of ‘operator<<’ as non-function

深究其具体原理,是在编译生成汇编文件时出了问题

而类模板,是在编译时生成两次,第一次生成类头,第二次实例化。

而友元运算符重载,是全局函数,导致模板类无法找到对应的友元函数。

所以需要进行前置声明,进行唯一前置绑定操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值