c++类模板之分文件编写问题及解决

我们在实际项目中一般习惯头文件(.h)和源文件(.cpp)分开写,这样做的好处良多,但是如果遇到了类模板,这样可能会有一点儿问题。

我们通过一个例子来看:

person.h:

 #pragma once
#include<string>
#include<iostream>
using namespace std; template<class nameType,class ageType>
class Person {
public:
Person(nameType name, ageType age);
void show();
nameType m_Name;
ageType m_Age;
};

person.cpp:

 #include"person.h"

 template<class nameType,class ageType>
Person<nameType, ageType>::Person(nameType name,ageType age)
{
this->m_Name = name;
this->m_Age = age;
} template<class nameType,class ageType>
void Person<nameType, ageType>::show()
{
cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}

main.cpp:

 #include<iostream>
using namespace std;
#include "person.h"
void test()
{
Person<string, int> p("张三", );
p.show();
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}

编译发现如下错误:

c++类模板之分文件编写问题及解决

错误原因分析:

由于类模板的成员函数是运行时才会创建,所以分文件编写时编译器找不到成员函数的实现

问题解决:

方法一(不推荐)

直接在main.cpp里将person.cpp包含进来,如下所示:

 #include<iostream>
using namespace std;
#include "person.cpp"
void test()
{
Person<string, int> p("张三", );
p.show();
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}

方法二(推荐)

将person.h、person.cpp的内容全部放入同一个文件person.hpp中,然后在main.cpp中将person.hpp包含进来即可

person.hpp:

 #pragma once
#include<string>
#include<iostream>
using namespace std; template<class nameType,class ageType>
class Person {
public:
Person(nameType name, ageType age);
void show();
nameType m_Name;
ageType m_Age;
}; template<class nameType, class ageType>
Person<nameType, ageType>::Person(nameType name, ageType age)
{
this->m_Name = name;
this->m_Age = age;
} template<class nameType, class ageType>
void Person<nameType, ageType>::show()
{
cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}

main.cpp:

 #include<iostream>
using namespace std;
#include "person.hpp"
void test()
{
Person<string, int> p("张三", );
p.show();
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}

运行结果:

c++类模板之分文件编写问题及解决

总结:模板类不要分文件编写,写到一个类中即可

上一篇:c++类模板分文件编写存在的问题


下一篇:WebService的发布及客户端的调用