假设我在Person.h中编写了如下类模板
#pragma once
#include <iostream>
#include <string>
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中写成如下
#include "Person.h"
//建议 模板不要做分文件编写,写到一个类中即可,类内进行声明和实现,最后把后缀名改为.hpp 约定俗成
int main(){
Person<string, int>p("猪八戒", 10);
p.showPerson();
system("pause");
return EXIT_SUCCESS;
}
在编译的时候,实际根本就编译不过,提示, 2 个无法解析的外部命令。为什么会出现这样的错误,这2个无法解析的外部命令,指的是什么呢?
实际上指的是person()和showPerson(),编译器在编译的时候没有找到这两个函数的实体,你可能会有疑问,我不是在cpp里已经实现了函数的实体吗?为什么还找不到。这是因为类模板的函数实体,只有在运行的时候才会被创建,所以编译器无法根据头文件找到cpp中的函数实体。因此就报了错误。要解决这种错误也很简单,直接将类模板的函数实现放在头文件中就行了,如下:
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;
}