类模板中成员函数的类外实现
我们先来写一个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;
}