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

    结果:

  • 相关阅读:
    反向代理实例
    nginx常用命令和配置
    nginx的安装
    Can Live View boot up images acquired from 64bit OS evidence?
    What is the behavior of lnk files?
    EnCase v7 search hits in compound files?
    How to search compound files
    iOS 8.3 JB ready
    Sunglasses
    现代福尔摩斯
  • 原文地址:https://www.cnblogs.com/yifengs/p/15181539.html
Copyright © 2011-2022 走看看