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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐