摘要:本文主要向大家介绍了C/C++知识点之C++类模版源文件与头文件分离易错点,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之C++类模版源文件与头文件分离易错点,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
考虑下面的一个自定义泛型类:
Person.h
#ifndef C_LEARNING_类模版源文件与H分离_H
#define C_LEARNING_类模版源文件与H分离_H
template <typename T>
class Person{
public:
T age;
public:
void Show();
Person(T age);
};
#endif
Person.cpp
#include "Person.h"
#include <iostream>
using namespace std;
template <typename T>
Person<T>::Person(T age){
this->age = age;
}
template <typename T>
void Person<T>::Show(){
cout<<age<<endl;
}
主调文件main.cpp
#include <iostream>
#include "Person.cpp"
int main()
{
Person<int> p(20);
p.Show();
}
编译时编译器会报错,表示没有找到对应 Person<int> p(20); 的符号表。这是为什么呢?
原来,根据C++的编译机制,以上三个文件都是由编译器分别独立编译再用链接器将各种调用连接起来。在main.cpp里,编译器发现有 Person<int> p(20); 这条语句,但是在本文件中未找到相应的Person构造函数实现,所以先将它置入编译期的符号表(Symbols table)里,然后在include进的 Person.h 中查找。
而.h中仅仅是Person模版类的声明,具体实现仍在 Person.cpp 文件中。而 Person.cpp 中的类模版以及函数模版在定义的地方被编译器编译过了一次,但是在main.cpp 中的操作需要根据具体的int类型再次编译从而生成出对应的具体类与函数。此时链接器找不到具体实现,从而编译失败。
此时我们建议,写类模版的时候,将声明与实现写在一个cpp文件里. 还有一种方式是写在hpp文件里
本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号