C++ 类模板中友元函数问题

#pragma once
#include<iostream>
template<typename T>
class TestFriendTemplate
{
public:

	//模板类的友元函数的实现放在类外时,需加个<T>
	friend std::ostream& operator< <T> (std::ostream& out, const TestFriendTemplate<T>& ftemp);
	friend void TestFunc<T>(const TestFriendTemplate<T>& tmp);

	//模板以类的友元函数的实现在类内时,一切正常,不需要加<T>
	friend std::ostream& operator<< (std::ostream& out, const TestFriendTemplate<T>& ftemp) {
		out << "TestFriendTemplate.operator<<:" << ftemp.x << ", " << ftemp.y;
		return out;
	}

	static void TestFriendTemp() {
		printf("TestFriendTemplate\n");

		std::ostream& out = std::cout; //正确
		//std::ostream out = std::cout; //报错,basic_ostream(const basic_ostream&) = delete,禁止copy了
	}

private:
	int x = 0;
	int y = 1;
};

template<typename T>
std::ostream& operator<(std::ostream& out, const TestFriendTemplate<T>& ftemp)
{
	out << "TestFriendTemplate.operator<:" << ftemp.x << ", " << ftemp.y;
	return out;
}

//实现写在这里可以,如果移动到一个cpp文件中,就编译不过了,这也是模板的一个典型问题(当声明和实现分别在头文件和CPP中时)
template<typename T>
void TestFunc(const TestFriendTemplate<T>& tmp) {
	std::cout << "TestFunc:" << std::endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值