zoukankan      html  css  js  c++  java
  • 类模板碰到友元函数(类外实现)

    难点

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

    结果:

  • 相关阅读:
    ZOJ 1403 解密
    HDU 1021 斐波那契
    Wannafly挑战赛26题解
    NOI2019省选模拟赛 第三场
    NOI2019省选模拟赛 第五场
    洛谷P5280 [ZJOI2019]线段树(线段树)
    NOI2019省选模拟赛 第六场
    Wannafly挑战赛29题解
    李超线段树学习笔记
    洛谷P4069 [SDOI2016]游戏(李超线段树)
  • 原文地址:https://www.cnblogs.com/yifengs/p/15181539.html
Copyright © 2011-2022 走看看