难点
1.不注意普通函数加上template<> 就成了模板函数, 而友元函数声明的时普通函数, 找不到普通函数的实现链接 err1
2.类内声明了模板函数,但此时声明因为有 <>所以编译器看不到,需要在这之前先声明函数
3.声明了函数还是会报错,因为函数中的参数 Person类并没有声明,所以还要在此之前声明类
类外实现
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //让编译器提前看到Person类的声明 template<class T1, class T2>class Person; //success //让编译器提前看到printPerson声明 template<class T1, class T2>void printPerson(Person<T1, T2>& p); //err3 因为此时编译器看不到Person类的声明 template<class T1, class T2> class Person { //friend void printPerson(Person<T1, T2>& p); //普通函数声明 没有普通函数实现 //利用空参数列表 告诉编译器 模板函数的声明 friend void printPerson<>(Person<T1, T2>& p); //err2 但此时声明因为有 <>所以编译器看不到 public: Person(T1 name, T2 age) { this->m_Name = name; this->m_Age = age; } private: T1 m_Name; T2 m_Age; }; //类外实现 模板函数 不是普通函数 template<class T1, class T2> void printPerson(Person<T1, T2>& p) { cout << "姓名:" << p.m_Name << " 年龄: " << p.m_Age << endl; } void test01() { Person<string, int> p("大圣", 500); printPerson(p); //err1 链接不到普通函数实现 } int main() { test01(); system("Pause"); return 0; }
结果: