c++类模板分文件编写存在的问题

c++分文件编写的编译机制:

各个文件独立编译,如果在某.cpp文件中出现了函数调用,但是在此.cpp文件并没有对应函数的实现。此时就会在函数调用出生成特定的符号,在之后的链接过程完成函数调用。

C++模板的编译机制:

模板都会进行两次编译。当编译器第一次遇到模板时进行一次普通的编译,当调用函数模板时进行第二次编译。第二次编译将特定值带入编译如:

在分文件编写类模板,不调用时。编译是不会出现问题的。如下:

Car.h文件

 1 #ifndef _CAR_H
 2 #define _CAR_H
 3
 4
 5 template<class T>
 6 class Car{
 7 public:
 8     Car(T c);
 9     ~Car();
10     T GetColor();
11 private:
12     T Color;//颜色
13 };
14
15 #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”

原文地址:https://www.cnblogs.com/lovemee/p/10706061.html

时间: 2024-10-03 22:38:50

c++类模板分文件编写存在的问题的相关文章

第58课 类模板的概念和意义

1. 类模板 (1)一些类主要用于存储和组织数据元素 (2)类中数据组织的方式和数据元素的具体类型无关.如数组类.链表类.Stack类.Queue类等. (3)C++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能. 2. C++中的类模板 (1)以相同的方式处理不同的类型 (2)在类声明前使用template进行标识. (3)<typename T>用于说明类中使用的泛指类型T template <typename T> class Ope

类模板(四十八)

我们上节博客介绍了泛型编程思想,那么在 C++ 中是否可以将泛型的思想应用于类呢?答案肯定是显而易见的,在 C++ 中的标准库中,就是一些通用的类模板.我们先来看看类模板有哪些特性,它主要是用于存储和组织数据元素,类中数据组织的方式和数据元素的具体类型无关,如:数组类.链表类.Stack 类等.C++ 中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能. 在 C++ 中的类模板是以相同的方式处理不同的类型,并且在类声明前使用 template 进行标识.<

C++解析(26):函数模板与类模板

0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1.函数模板 1.1 函数模板与泛型编程 C++中有几种交换变量的方法? 交换变量的方法--定义宏代码块 vs 定义函数: 定义宏代码块 优点:代码复用,适合所有的类型 缺点:编译器不知道宏的存在,缺少类型检查 定义函数 优点:真正的函数调用,编译器对类型进行检查 缺点:根据类型重复定义函数,无法代码复

类模板的概念和意义

思考:在C++中是否能够将泛型的思想应用于类? 类模板 一些类主要用于存储和组织数据元素 类中数据组织的方式和数据元素的具体类型无关 如:数组类,链表类,Stack类,Queue类,等 C++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能. C++中的类模板 以相同的方式处理不同的类型 在类声明前使用template进行标识 <typename T>用于说明类中使用的泛指类型T template <typename T> { public:

C++ 模板的编译 以及 类模板内部的实例化

在C++中,编译器在看到模板的定义的时候,并不立即产生代码,只有在看到用到模板时,比如调用了模板函数 或者 定义了类模板的 对象的时候,编译器才产生特定类型的代码. 一般而言,在调用函数的时候,只需要知道函数的声明即可: 在定义类的对象时,只需要知道类的定义,不需要成员函数的定义. 但是,这对于模板编译是不奏效的,模板要进行实例化,则必须能够访问定义模板的源代码,当调用函数模板以及类模板的成员函数 的时候,需要知道函数的定义. 标准C++对于模板的编译提供了两种策略: 相同之处:"将类定义以及函

Xcode6中如何使用自定义的类模板

说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewController 创建出来的ClassTemplateVC如下: #import "ClassTemplateVC.h" @interface () @end @implementation ClassTemplateVC - (void)viewDidLoad { [super viewDidLoa

自动添加版权信息(修改类模板文件、窗体模板文件)

1.首先在记事本中准备版权文本信息 2.修改类模板文件(分窗体和WEB类模板) 1)窗体类模板(通用窗体类模板) 修改路径为:%vs%\Common7\IDE\ItemTemplatesCache\CSharp\Code\2052\Class\Class.cs (注意Code文件夹下会有1033是英文版,中文版是2052,%vs%为你的VS安装路径) 2)WEB类模板(ASP.NET MVC WEBSERVICE等项目时新建的类模板) 修改路径为:%vs%\Common7\IDE\ItemTem

用 Qt 中的 QDomDocument类 处理 XML 文件(上)

我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XML的操作分为以下几类: 1 首先对XML文件进行操作,打开文件. 这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成. TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_

函数模板与类模板

函数模板,顾名思义,是在生成函数时依照的模板. 有时,我们需要对不同的数据类型做同样的函数操作. 比如:分别对一个int类型数 和 一个double类型数求平方. 这时,虽然都是同样的求平方操作(函数体内代码一样),但是我们必须要编写两个不同的函数,因为处理int类型的函数的参数和返回值类型都应该是int,而处理double类型的函数的参数和返回值都应该是double. 如下:函数体内操作代码一样,设计为重载函数,用相同的函数名,但是参数类型和返回值类型却都不一样,函数需要定义两次. int S