c++类模板分文件编写存在的问题
2019-04-14 17:38
627 查看
c++分文件编写的编译机制:
各个文件独立编译,如果在某.cpp文件中出现了函数调用,但是在此.cpp文件并没有对应函数的实现。此时就会在函数调用出生成特定的符号,在之后的链接过程完成函数调用。
C++模板的编译机制:
模板都会进行两次编译。当编译器第一次遇到模板时进行一次普通的编译,当调用函数模板时进行第二次编译。第二次编译将特定值带入编译如:
在分文件编写类模板,不调用时。编译是不会出现问题的。如下:
Car.h文件
#ifndef _CAR_H #define _CAR_H template<class T> class Car{ public: Car(T c); ~Car(); T GetColor(); private: T Color;//颜色 }; #endif
Car.cpp文件
#include"Car.h" #include <iostream> #include <string> using namespace std; template<class T> Car<T>::Car(T c) { this->Color = c; } template<class T> Car<T>::~Car() { cout << "~Car___析构函数" << endl; } template<class T> T Car<T>::GetColor() { return this->Color; }
mian.cpp文件
#include <iostream> #include <string> #include "Car.h" using namespace std; int main() { //没有调用类模板 system("pause"); return 0; }
在没用调用类模板的情况下编译:(成功,这也很好的证明C++分文件编译的机制)
如果将main.cpp改为如下情况在编译:
#include <iostream> #include <string> #include "Car.h" using namespace std; int main() { Car<string>car("red"); car.GetColor(); system("pause"); return 0; }
在调用模板的情况编译:(失败,在main.cpp中调用了string GetColor()函数,在main.cpp中并没有该函数而且在其他文件中也没此函数)
解决方法:
1.将Car.cpp改为Car.hpp
2.将#include"Car.h"改为#include“Car.hpp”
相关文章推荐
- VS2005的一个小问题,我编写了一个min函数,使用模板,传递的参数没有智能提示
- ISS6 WEB服务器不能访问 grf 报表模板文件的问题
- 用C++类模板实现栈结构出现的问题以及思考
- 利用File.Create创建文件存在的问题
- 关于android R.layout 中找不到已存在的布局文件问题的解决
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- ISS7 WEB服务器不能访问 grf 报表模板文件的问题
- windows下的动态链接问题(.dll文件的编写与调用)
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- django应用找不到settings配置文件,但settings.py文件确实存在的问题
- ISS7 WEB服务器不能访问 grf 报表模板文件的问题
- MIB非table的.h文件编写模板
- JNI中cpp文件编写,解决Unresolved inclusion问题
- VC++深入详解笔记 C++类的设计习惯及头文件重复包含问题的解决
- 关于R.layout中找不到已存在的布局文件问题
- 编写批处理文件时传入多个参数的问题
- 解决Visual studio 不能加载文件模板的问题
- Win7、Windows Server 2008下无法在Windows Service中打开一个已经存在的Excel 2007文件问题的解决方案
- C++类的设计习惯及头文件重复包含问题的解决
- Excel导出实例(打开模板,写信息后另存为新excel文件) 在部署时候出问题Windows7 64 bit 下解决:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败