BZ易风

导航

 

难点

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;
}

结果:

 

posted on 2021-08-24 17:57  BZ易风  阅读(77)  评论(0编辑  收藏  举报