类模板的分文件编写的问题和解决(要引入.cpp而不是头文件)

分文件解决

  • .h .cpp分别写声明和实现
  • 但是由于 类模板的成员函数运行阶段才去创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令
  • 解决方案  保护 .cpp文件 (不推荐)
  • 不要进行分文件编写,写到同一个文件中,进行声明和实现,后缀名改为.hpp
  • 约定俗成的 (.hpp文件即分文件模板文件)

头文件

Person.h

#pragma once
#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;
}

main

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include "Person.h"

void test01()
{
    Person<string, int>p("猪八戒", 30);    //error 无法解析的外部命令
    p.showPerson();                        //error
}

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

无法运行:

解决办法:

main中引入.cpp文件

 结果:

建议

模板不要分文件编写,写到一个类中即可,类内进行声明和实现,最后把后缀名改为.hpp 约定俗成  

把Person.cpp的内容放入Person.h中 并把Person.h改后缀为 Person.hpp

#pragma once
#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;
};
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;
}

 结果:

原文地址:https://www.cnblogs.com/yifengs/p/15181343.html