#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;
}
C++ 类模板中友元函数问题
于 2022-03-22 19:34:47 首次发布