c++类模板分文件编写存在的问题
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 ;
}
在没用调用类模板的情况下编译:(成功,这也很好的证明C++分文件编译的机制)

如果将main.cpp改为如下情况在编译:
#include <iostream>
#include <string>
#include "Car.h" using namespace std; int main()
{
Car<string>car("red");
car.GetColor();
system("pause");
return ;
}
在调用模板的情况编译:(失败,在main.cpp中调用了string GetColor()函数,在main.cpp中并没有该函数而且在其他文件中也没此函数)

解决方法:
1.将Car.cpp改为Car.hpp
2.将#include"Car.h"改为#include“Car.hpp”

c++类模板分文件编写存在的问题的更多相关文章
- c++类模板之分文件编写问题及解决
我们在实际项目中一般习惯头文件(.h)和源文件(.cpp)分开写,这样做的好处良多,但是如果遇到了类模板,这样可能会有一点儿问题. 我们通过一个例子来看: person.h: #pragma once ...
- 【C/C++】函数的分文件编写
创建同名的头文件(.h)和cpp文件. 在头文件里写函数声明,在cpp文件中写函数定义. 在cpp文件中写#include "xx.h" //自定义头文件名 框架(include ...
- C++函数模板&类模板
函数模板 模板概念及语法 主要目的,简化代码,减少重复代码.基本语法格式: template<class T> 或者 template<typename T> //末尾不加分 ...
- C++进阶-1-模板基础(函数模板、类模板)
C++进阶 模板 1.1 函数模板 1 #include<iostream> 2 using namespace std; 3 4 // 模板 5 6 // 模板的简单实例 7 // 要求 ...
- C++解析(26):函数模板与类模板
0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1. ...
- Xcode6中如何使用自定义的类模板
说到IOS类的模板,有些人感觉很陌生,但是只要有开发过IOS程序的人,其实都用过类的模板,只不过是用的系统自带的类的模板. 例如创建一个ClassTemplateVC继承于UIViewControll ...
- 28.C++- 单例类模板(详解)
单例类 描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针) , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区 ...
- C++ 模板的编译 以及 类模板内部的实例化
在C++中.编译器在看到模板的定义的时候.并不马上产生代码,仅仅有在看到用到模板时,比方调用了模板函数 或者 定义了类模板的 对象的时候.编译器才产生特定类型的代码. 一般而言,在调用函数的时候,仅仅 ...
- Repository模式--采用EF Fluent API使用EntityTypeConfiguration分文件配置Model映射关系
EF中类EntityTypeConfiguration是一个很有用的类,在nopCommerence中就使用这个类来分文件分文件配置Model映射关系.今天我就来谈谈Repository模式在Enti ...
随机推荐
- Spring Data MongoDB 级联操作
DBRef 方式关联 DBRef 就是在两个Collection之间定义的一个关联关系,暂不支持级联的保存功能 例子:一个Person对象有多个Book对象,一对多关系 实体Person public ...
- flask框架下的jinja2模板引擎(2)(过滤器与自定义过滤器)
flask框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html 这篇论文主要用来记录下 jinja2 的过滤器. 什么是过 ...
- 新建虚拟机,每次都提示无法连接虚拟设备 ide1:0
处理方式:看到了这个老哥http://www.cnblogs.com/dean-du/p/6888513.html的博客,发现问题是一样的,所以记录一下. 将虚拟机设置中的CD/DVD选项中的连接更改 ...
- SQL点点滴滴_特殊用法笔记
声明: 本文为转载,感谢原作者的辛勤付出. 原博客地址为:http://www.cnblogs.com/icyJ/p/SQL_Statement.html 1.MERGE用法:关联两表,有则改,无则加 ...
- Scratch www 系统搭建
原文地址:https://blog.csdn.net/litianquan/article/details/82735809 Scratch www要基于Nodejs的环境才可以运行,我尝试了在Win ...
- Linux(CentOS)网卡的基本设置
临时设置 修改IP地址: ifconfig eth0 10.60.45.205 mask 255.255.255.0 修改网关地址 route add default gw 10.60.45.1 de ...
- Python实例---抽屉热搜榜前端代码分析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [EffectiveC++]item02:尽量以const,enum,inline代替#define
- kafka部分重要参数配置-broker端参数
broker端参数主要在config/server.properties目录下设置: 启动命令:nohup ./kafka-server-start.sh -daemon ../config/serv ...
- PL\SQL Developer连接本地Oracle 11g数据库
1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...