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