类模板 - 成员函数的类外实现

类模板中成员函数的类外实现

我们先来写一个Person类模板:

template <class T1, class T2>
class Person
{
public
    Person(T1 name, T2 age)
    {
        this->m_Age = age;
        this->m_Name = name;
    }
    void shouPerson()
    {
        cout << "姓名:" <<this->m_Name<<" 年龄:"<<this->m_Age<< endl;
    }
    T1 m_Name;
    T2 m_Age;
};

现在我们尝试着把成员函数在类内声明,在类外实现

template <class T1, class T2>
class Person
{
public:
    
    //类内声明
    Person(T1 name, T2 age);
    void shouPerson();

    T1 m_Name;
    T2 m_Age;
};

template <class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
    this->m_Age = age;
    this->m_Name = name;
}

template <class T1, class T2>
void Person<T1, T2>::shouPerson()
{
    cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}

void test01()
{
    Person<string, int> p1("张三", 20);
    p1.shouPerson();
}

这里和普通类不一样的地方在于

  • 类模板的作用域是要加上类模板的参数列表<T1, T2>的,来表示这是一个类模板的作用域,而不是一个普通类的作用域;
  • 要提前说明template<T1,T2>,否则T1,T2会报错。

实现分文件编写

你可能会以为这和一般的类分文件编写没什么区别,把类写在头文件person.h里,把函数实现写在源文件person.cpp中,然后在主文件main.cpp中包含头文件(#include"person.h")。但是这样会出现错误的。我们之前讨论过了类模板中成员函数的创建时期,了解到在编译阶段是不会创建函数的。只有在我们通过这个类模板实例化一个对象的时候才会创建这个成员函数。如果只是包含了头文件,编译器在链接阶段会找到函数的实体,导致错误。所以可以包含源文件(include"person.cpp")。以下是文件内容:

  • person.h
#include <iostream>
#include <string>

using namespace std;
template <class T1, class T2>
class Person
{
public:
    
    //类内声明
    Person(T1 name, T2 age);
    void shouPerson();

    T1 m_Name;
    T2 m_Age;
};
  • person.cpp
#include "person.h"
template <class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
    this->m_Age = age;
    this->m_Name = name;
}

template <class T1, class T2>
void Person<T1, T2>::shouPerson()
{
    cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}


  • main.cpp
#include "person.cpp"//包含源文件

void test01()
{
    Person<string, int> p1("张三", 20);
    p1.shouPerson();
}

int main()
{
    test01();
    system("pause");
    return 0;
}

但是呢,包含源文件这中写法很奇怪,所以大家一般是把类模板写在一个后缀名为“.hpp”的文件中。以下为文件内容:

  • person.hpp
#include <iostream>
#include <string>

using namespace std;
template <class T1, class T2>
class Person
{
public:
    
    //类内声明
    Person(T1 name, T2 age);
    void shouPerson();

    T1 m_Name;
    T2 m_Age;
};

template <class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
    this->m_Age = age;
    this->m_Name = name;
}

template <class T1, class T2>
void Person<T1, T2>::shouPerson()
{
    cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}
  • main.cpp
#include "person.hpp"//.hpp源文件

void test01()
{
    Person<string, int> p1("张三", 20);
    p1.shouPerson();
}

int main()
{
    test01();
    system("pause");
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容