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

    结果:

  • 相关阅读:
    ODBC是什么
    node学习连接和网站
    MongoDB--连接客户端和服务
    css页面布局--三栏(两边固定中间自适应&两边自适应中间固定)
    MongoDB--搭建mongodb服务器
    MongoDB--编译文件
    MongoDB--运行环境
    Ubuntu下搜狗输入法乱码
    从命令行控制计算机屏幕
    CPU风扇转速异常
  • 原文地址:https://www.cnblogs.com/yifengs/p/15181539.html
Copyright © 2011-2022 走看看