一:
一般情况下,C++编写代码时,类的声明和实现是由2个文件分开来写的。
".h"放的是类的声明,“.cpp”放的是类的实现,然后使用该类的时候,就把该类对应的“ .h ”引用上就OK的了。
但是在类模板中这样就不行。
(1)
如下:
Person.h的这个文件放Person类的声明
#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这个就编写Person类的实现。代码如下:
#include "Person.h"
template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
m_Name=name;
m_Age=age;
}
template<class T1,class T2>
void Person<T1,T2>::showPerson()
{
cout<<"name: "<<this->m_Name<<endl;
cout<<"age: "<<this->m_Age<<endl;
}
/*===================================*/
然后在main函数所在的那个文件(main.cpp)使用Person这个类的时候,编写如下:
也就是main.cpp的内容即下:
#include "Person.h"
int main()
{
Person<string ,int> p("zhou",20); // ①
p.showPerson(); //②
return ;
}
然后使用g++编译,g++ main.cpp -o main
这个时候链接就会报错的,在上面代码的① 和②这两个地方会报错。
(2)
为啥链接会报错的呢?
因为C++进行的是单元编译,在main.cpp里面对 p.showPerson()编译链接时,对 #include "Person.h" 这个文件查找,p.showPerson 属于类模板的成员方法,不会生成这样的代码,类模板的成员方法一开始不会创建,因为类型 不确定。
person.cpp虽然有实现的函数,但是成员函数并不会生成,导致链接的时候也不会找到的
所以类模板不建议分文件来编写。
总结:由于类模板的成员函数运行阶段才去创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令。
/*==================================================*/
但上面main.cpp的有个简单的更改方法。
#include "Person.cpp"
int main()
{
Person<string ,int> p("zhou",20); // ①
p.showPerson(); //②
return ;
}
也就是把#include "Person.h"改成 #include "Person.cpp",但是不建议写成这样。
二:
类模板一般就把声明和实现写进同一个文件,并把文件名改成“ .hpp ”,当我们看到这个后缀的时候,我们就这个文件是个模板类。
上面的例子Person类,合进一个文件如下:
/*========================================*/
#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;
};
template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
m_Name=name;
m_Age=age;
}
template<class T1,class T2>
void Person<T1,T2>::showPerson()
{
cout<<"name: "<<this->m_Name<<endl;
cout<<"age: "<<this->m_Age<<endl;
}
然后把文件保存为 Person.hpp
接着在main.cpp的文件更改如下:
#include "Person.hpp"
int main()
{
Person<string ,int> p("zhou",20); // ①
p.showPerson(); //②
return ;
}
然后g++ main.cpp -o main,这样就可以编译通过的了。如下图,就是运行的结果:
原文链接: https://www.cnblogs.com/Unclebigdata/p/14477353.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/208556
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!