C++高级编程,类模版成员函数类外实现
#include <iostream>
#include <string>//类模版成员函数类外实现
template<class T1,class T2>
class Person
{//Person构造函数
public:Person(T1 name,T2 age);// {// this->m_Name=name;// this->m_Age=age;// }//Person的成员函数void showPerson();// {// std::cout<<"Name: "<<this->m_Name<<std::endl;// std::cout<<"Age: "<<this->m_Age<<std::endl;// }T1 m_Name;T2 m_Age;
};
//构造函数的类外实现
//要加上一个作用域
//如果没有Person<T1,T2>::前缀,编译器会认为这是一个全局函数,并且编译器会认为这是一个普通函数的类外实现
template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age){this->m_Name=name;this->m_Age=age;
}
//成员函数的类外实现
template<class T1,class T2>
void Person<T1,T2>::showPerson(){std::cout<<"Name: "<<this->m_Name<<std::endl;std::cout<<"Age: "<<this->m_Age<<std::endl;}
void test01()
{//创建Person类的对象Person<std::string,int> p("Tom",18);//调用成员函数p.showPerson();
}
int main()
{test01();return 0;
}
类模版分文件编写
问题:类模版中成员函数创建时机是在调用阶段,导致分文件编写时链接不到。
- 解决方式1:直接包含.cpp源文件
- 解决方法2:将声明和实现写在同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制。
main.cpp
#include <iostream>
using namespace std;
#include "person.h"//类模版的分文件编写的问题以及解决// template <class T1,class T2>
// class Person{
// public:
// Person(T1 name,T2 age);// void showPerson();// T1 m_Name;
// T2 m_Age;
// };// template <class T1,class T2>
// Person<T1,T2>::Person(T1 name, T2 age)
// {
// this->m_Name = name;
// this->m_Age = age;
// }// template<class T1,class T2>
// void Person<T1,T2>::showPerson()
// {
// cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
// }
void test01()
{Person<string,int> p("Jerry",28);p.showPerson();
}int main()
{test01();return 0;
}
person.h
#include <iostream>
using namespace std;template <class T1,class T2>
class Person{public:Person(T1 name,T2 age);void showPerson();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_Name = name;this->m_Age = age;
}template<class T1,class T2>
void Person<T1,T2>::showPerson()
{cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}template class Person<string,int>;
template class Person<string,int>;